国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

leecode 解題總結(jié):116. Populating Next Right Pointers in Each Node

2019-11-08 20:14:42
字體:
供稿:網(wǎng)友
#include <iostream>#include <stdio.h>#include <vector>#include <queue>#include <sstream>using namespace std;/*問題:Given a binary tree    struct TreeLinkNode {      TreeLinkNode *left;      TreeLinkNode *right;      TreeLinkNode *next;    }Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.Initially, all next pointers are set to NULL.Note:You may only use constant extra space.You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).For example,Given the following perfect binary tree,         1       /  /      2    3     / /  / /    4  5  6  7After calling your function, the tree should look like:         1 -> NULL       /  /      2 -> 3 -> NULL     / /  / /    4->5->6->7 -> NULL分析:給定一顆二叉樹,填充結(jié)點的next指針來指向它的下一個右邊的結(jié)點。如果沒有下一個右側(cè)的結(jié)點,下一個指針應(yīng)該被設(shè)置為空。初始化,所有下一個指針都是被設(shè)置為NULL。注意:1】只能使用常量空間2】可以假設(shè)這顆二叉樹是一個完全二叉樹,所有的葉子結(jié)點都是在同一層每個父節(jié)點都有兩個孩子結(jié)點。根節(jié)點的next為空,從根節(jié)點往下,最左邊的孩子結(jié)點都會指向右邊的指針。假設(shè)當(dāng)前結(jié)點為root,root->left->next = root->right;root->right->next = NULL;這個類似之前做的判斷一棵樹是不是對稱,遞歸的輸入一定是當(dāng)前結(jié)點的左右孩子結(jié)點輸入:71 2 3 4 5 6 715-1 0 1 2 3 4 5 6 7 8 9 10 11 12 13輸出:1 NULL 2 3 NULL 4 5 6 7 NULL-1 NULL,0 1 NULL, 2 3 4 5 NULL, 6 7 8 9 10 11 12 13 NULL報錯:原因是中間有兩個結(jié)點忘記連接了Input:{-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13}Output:{-1,#,0,1,#,2,3,4,5,#,6,7,8,9,#}Expected:{-1,#,0,1,#,2,3,4,5,#,6,7,8,9,10,11,12,13,#}						-1				0				1			2		3		4		5		  6	   7   8  9   10  11   12  13關(guān)鍵:1 這個類似之前做的判斷一棵樹是不是對稱,遞歸的輸入一定是當(dāng)前結(jié)點的左右孩子結(jié)點	//下面是左右孩子都非空的,讓左孩子的next指向右孩子,右孩子的next指向空	leftNode->next = rightNode;	rightNode->next = NULL;	//處理各自的左右孩子結(jié)點	connectHelper(leftNode->left , leftNode->right);	//別忘記中間需要連接,但是這一組卻不需要遞歸;也是需要遞歸的,否則會遺漏中間連接的部分,	connectHelper(leftNode->right , rightNode->left);	connectHelper(rightNode->left , rightNode->right);	}*/struct TreeLinkNode { int val; TreeLinkNode *left, *right, *next; TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {} TreeLinkNode() : left(NULL), right(NULL), next(NULL) {} };class Solution {public:	//由于是完全二叉樹,那么一棵樹的左右孩子結(jié)點要么全部為空,要么全部都不空	void connectHelper(TreeLinkNode* leftNode , TreeLinkNode* rightNode )	{		//當(dāng)前結(jié)點的孩子結(jié)點都為空,無需連接		if(NULL == leftNode && NULL == rightNode)		{			return;		}		//只有一個為空,不符合題目條件,不處理		if(NULL == leftNode || NULL == rightNode)		{			return;		}		//下面是左右孩子都非空的,讓左孩子的next指向右孩子,右孩子的next指向空		leftNode->next = rightNode;		rightNode->next = NULL;		//處理各自的左右孩子結(jié)點		connectHelper(leftNode->left , leftNode->right);		//別忘記中間需要連接,但是這一組卻不需要遞歸;也是需要遞歸的,否則會遺漏中間連接的部分,		connectHelper(leftNode->right , rightNode->left);		connectHelper(rightNode->left , rightNode->right);	}    void connect(TreeLinkNode *root) {		//根節(jié)點為空,不需要處理        if(!root)		{			return;		}		//接下來設(shè)置根節(jié)點自己的next指針為null		root->next = NULL;		//遞歸處理孩子結(jié)點		connectHelper(root->left , root->right );    }};const int MAXSIZE = 1000;TreeLinkNode gNodeArr[MAXSIZE];int gIndex;TreeLinkNode* createNode(int value){	++gIndex;	gNodeArr[gIndex].val = value;	return &gNodeArr[gIndex];}//構(gòu)建二叉樹,這里默認(rèn)首個元素為二叉樹根節(jié)點,然后接下來按照作為每個結(jié)點的左右孩子的順序遍歷TreeLinkNode* buildBinaryTree(vector<int>& nums){	if(nums.empty())	{		return NULL;	}	TreeLinkNode* root;	int size = nums.size();	int j = 0;	//結(jié)點i的孩子結(jié)點是2i,2i+1	for(int i = 0 ; i < size ; i++)	{		if(i)		{			createNode(nums.at(i));		}		else		{			root = createNode(nums.at(i));		}	}	//設(shè)定孩子結(jié)點指向,	for(int i = 1 ; i <= size ; i++)	{		if(2 * i <= size)		{			gNodeArr[i].left = &gNodeArr[2*i];		}		if(2*i + 1 <= size)		{			gNodeArr[i].right = &gNodeArr[2*i + 1];		}	}	//設(shè)定完了之后,返回根節(jié)點	return root;}//層序遍歷void levelVisit(TreeLinkNode* root, vector< string >& result){	if(!root)	{		return;	}	queue<TreeLinkNode*> nodes;	nodes.push(root);	int size = 1;	int nextSize = 0;	TreeLinkNode* node;	vector<TreeLinkNode*> beginNodes;	//先找到每一層的起始結(jié)點,也就是size=0的結(jié)點,然后對每個起始結(jié)點遍歷即可	while(!nodes.empty())	{		node = nodes.front();		nodes.pop();				//將每一層的起始結(jié)點存儲起來		if(0 == nextSize)		{			beginNodes.push_back(node);		}		if(node->left)		{			nodes.push(node->left);			nextSize++;		}		if(node->right)		{			nodes.push(node->right);			nextSize++;		}		size--;		if(0 == size)		{			size = nextSize;			nextSize = 0;		}	}	if(beginNodes.empty())	{		return;	}	int len = beginNodes.size();	TreeLinkNode* head = NULL;	for(int i = 0 ; i < len ; i++)	{		head = beginNodes.at(i);		stringstream stream;		while(head)		{			stream << head->val << "->";			head = head->next;		}		stream << "NULL";		result.push_back(stream.str());	}}void PRint(vector<string>& result){	if(result.empty())	{		cout << "no result" << endl;		return;	}	int size = result.size();	for(int i = 0 ; i < size ; i++)	{		cout << result.at(i) << " " ;	}	cout << endl;}void process(){	 vector<int> nums;	 int value;	 int num;	 Solution solution;	 vector<string> result;	 while(cin >> num )	 {		 nums.clear();		 result.clear();		 for(int i = 0 ; i < num ; i++)		 {			 cin >> value;			 nums.push_back(value);		 }		 TreeLinkNode* root = buildBinaryTree(nums);		 solution.connect(root);		 levelVisit(root, result);		 print(result);	 }}int main(int argc , char* argv[]){	process();	getchar();	return 0;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 凤山市| 富宁县| 昌乐县| 江北区| 茶陵县| 麻栗坡县| 凤翔县| 邵阳市| 常宁市| 宁河县| 黔江区| 云林县| 公主岭市| 西吉县| 大兴区| 吴江市| 金华市| 静安区| 法库县| 乌鲁木齐县| 甘洛县| 新津县| 河间市| 梁河县| 平遥县| 新蔡县| 龙泉市| 潜江市| 柯坪县| 宁武县| 满城县| 巴林左旗| 鄂州市| 永宁县| 广平县| 黄平县| 涞源县| 松阳县| 沾化县| 安顺市| 宜宾县|