您的位置:首页 > 职场人生

剑指Offer(第二版)面试题8:二叉树的下一个节点

2017-05-11 22:05 246 查看
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/71686674冷血之心的博客)

剑指Offer面试题8:二叉树的下一个节点

题目:给定一颗二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右子节点的指针,还有一个指向父节点的指针。
                    1  
 /    \  
2      3  
      /   \     /   \  
  4      5  7    6  

思路如下:
判断该节点是否有右孩子?若有,则下一个节点是右孩子节点的最左边的孩子节点。
反之,判断其是否是其父节点的左孩子?若是,则下一个节点就是其父节点
反之,向上寻找其父节点,直到找到父节点是其父节点的左孩子为此,此时,下一个节点为最后那个父节点。

代码如下:
public class Test {

public static void main(String[] args) {
TreeNode root = new TreeNode(1);
TreeNode r2 = new TreeNode(2);
TreeNode r3 = new TreeNode(3);
TreeNode r4 = new TreeNode(4);
TreeNode r5 = new TreeNode(5);
TreeNode r6 = new TreeNode(6);
TreeNode r7 = new TreeNode(7);

root.left = r2;
root.right = r3;

r2.parent = root;
r2.left = r4;
r2.right = r5;

r3.parent = root;
r3.right = r6;
r3.left = r7;

r4.parent = r2;
r5.parent = r2;

r7.parent = r3;
r6.parent = r3;
System.out.println(getNextTreeNode(r4).val);

}

private static TreeNode getNextTreeNode(TreeNode targetNode) {
if(targetNode==null)
return null;
TreeNode cur = null;
// 判断该节点是否有右孩子
if(targetNode.right!=null){
cur = targetNode.right;
while(cur.left!=null){ // 找出其右孩子节点的 最 左边孩子节点
cur = cur.left;
}
return cur;
}

// 若该节点没有右孩子节点,则判断其是否是其父节点的左孩子
if(targetNode.parent==null){
return null;
}
if(targetNode==targetNode.parent.left){
return targetNode.parent;
}

// 此时,该节点既没有右孩子节点,也不是其父节点的左孩子
// 步骤:向上寻找其父节点,直到找到父节点是其父节点的左孩子为此,此时,下一个节点为最后那个父节点
while(targetNode.parent!=null){
if(targetNode==targetNode.parent.left){
return targetNode.parent;
}
// 继续寻找
targetNode = targetNode.parent;
}

return null;

}

}
//建立二叉树节点类
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode parent;
public TreeNode(int val){
this.val = val;
}

}

如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: