二叉树的下一个结点
题目描述:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。
注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
问题分析:
两种方法:
方法一:暴力解法
1,根据给出的结点求出整棵树的根节点
2,根据根节点递归求出树的中序遍历,存入vector
3,在vector中查找当前结点,则当前结点的下一结点即为所求。
方法二:画出图形总结要求结点的规律 (放一下官方题解给出的示意图),然后使用js实现它
代码展示:
/*function TreeLinkNode(x){
this.val = x;
this.left = null;
this.right = null;
this.next = null;
}*/
function GetNext(pNode)
{
// 方法二:最优解法,画图总结规律
// 分成四类
// 1 :当前结点是父亲节点的左孩子
// 2 :当前结点右孩子结点,那么下一节点就是:右孩子结点的最左孩子结点,如果右孩子结点没有左孩子就是自己
// 3 :当前节点为父亲节点的右孩子结点 本质和1相同
// 4 :最尾结点
if(!pNode)
return pNode;
// 第二类
if(pNode.right){
pNode = pNode.right;
while(pNode.left){
pNode = pNode.left;
}
return pNode;
}
// 第一类 和 第三类
while(pNode.next){
let root = pNode.next;
if(root.left == pNode){
return root;
}
pNode = pNode.next;
}
//第四类
return null;
}
//在实现上有点问题,但是大概思路就是这样的
function GetNext(pNode)
{
// 方法一:暴力解法
// 根据给出的结点求出整棵树的根节点
// 根据根节点递归求出树的中序遍历,存入vector
// 在vector中查找当前结点,则当前结点的下一结点即为所求。
let root = null;
let tmp = pNode;
//第一步
while(tmp){
root = tmp;
tmp = tmp.next;
}
var v = [];
//第二步
pre_order(v);
//第三步
let n = v.length;
for(let i=0;i<n;i++){
if(v[i] == pNode && i+1 != n)
return v[i+1];
}
return null;
}
function pre_order(root,v){
if(!root)
return;
pre_order(root.left,v);
v.push(root);
pre_order(root.right,v);
}