继续思考"Populating Next Right Pointers in Each Node".这道题
如果给定的树可以是任意的二叉树呢?你之前的给出的算法还有效吗?
注意:
你只能使用常量的额外内存空间
层次遍历方法简单修改之后就能解决这道题目。
改写之前的递归做法应该也能解决问题。
层次遍历也完全不需要很麻烦,下面的代码很精简,值得学习。
链接:https://www.nowcoder.com/questionTerminal/f18bc13a954f4389900b56e545feca6e?f=discussion
来源:牛客网
class Solution { public: void connect(TreeLinkNode *root) { //利用层序遍历思想,需要注意的是对每层的节点都进行处理 if(root==NULL) return; queue<TreeLinkNode*> que; que.push(root); while(!que.empty()){ int n=que.size(); for(int i=0;i<n;i++){ TreeLinkNode* tmp=que.front(); que.pop(); if(tmp->left) que.push(tmp->left); if(tmp->right) que.push(tmp->right); if(i!=n-1) tmp->next=que.front(); else tmp->next=NULL; } } } };
还有一个理解起来比较费事,而书写的关键节点在于把握root.next这个属性
链接:https://www.nowcoder.com/questionTerminal/f18bc13a954f4389900b56e545feca6e?f=discussion 来源:牛客网 //虽然两个while循环中都有root,但是其代表的含义是不一样,第二层的root更多的是一个循环使用的变量,换一种新的写***更加容易理解。 public void connect(TreeLinkNode root) { while (root != null) {// 这里的root代表某一层的第一个节点 //tmpLevelFirst为新建立的每层第一个节点(为了方便后面遍历当前行节点) TreeLinkNode tmpLevelFirst = new TreeLinkNode(0); TreeLinkNode cur = tmpLevelFirst; while (root != null) {//主要利用节点的next的属性进行层次遍历 if (root.left != null) { cur.next