剑指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一起交流学习哦~
剑指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一起交流学习哦~
相关文章推荐
- 剑指Offer实现面试题8-二叉树的下一个节点
- 剑指Offer面试题58:二叉树的下一个节点
- 剑指offer面试题58 二叉树的下一个节点(Java实现)
- (剑指Offer)面试题58:二叉树的下一个结点
- python剑指offer系列二叉树的下一个节点
- 剑指Offer(第二版)面试题7:重建二叉树
- 面试题58:二叉树的下一个节点
- 《剑指Offer》学习笔记--面试题58:二叉树的下一个结点
- 面试题8:二叉树的下一个节点
- 剑指offer-面试题58-二叉树的下一个结点
- 剑指offer(二叉树的下一个节点)
- 剑指offer面试题[58]-二叉树的下一个结点
- 【剑指offer】面试题8:二叉树的下一个节点
- 《剑指offer》二叉树的下一个节点
- 《剑指Offer》面试题:从上往下打印出二叉树的每个节点
- <剑指offer 面试题8>二叉树的下一个节点(Java)
- 《剑指Offer》面试题:从上往下打印出二叉树的每个节点
- 【剑指offer】面试题 8:二叉树的下一个节点
- 剑指offer-面试题58:二叉树的下一个结点
- 面试题(八)二叉树的下一个节点