08 寻找二叉树中的下一个节点

题目描述

给定一个二叉树,树中节点的数据结构如下:

class TreeNode {
    TreeNode left;
    TreeNode right;
    TreeNode father;
    int val;
    public TreeNode(int val){
        this.val = val;
    }
}

任给一个节点的值num(树中节点的值各不相同),输出该值对应的下一个中序遍历节点。

解题步骤

一、根据num用dfs遍历得到num对应的节点node

public TreeNode dfsFindVal(TreeNode root, int num){
        if(root == null){
            return null;
        }
        if(root.val == num){
            return root;
        }
        if(dfsFindVal(root.left, num)!=null){
        //如果在左子树中找到
            return dfsFindVal(root.left, num);
        }else {
            return dfsFindVal(root.right, num);
        }
    }

二、根据node寻找它的下一节点
此时分四种情况:

  1. node有右子树,则node的下一个节点就是它的右子树中最左的节点;
  2. node没有右子树,且node没有父节点。则node的下一个节点为null;
  3. node没有右子树,且node是其父节点的左子节点。则node的下一个节点为其父节点;
  4. node没有右子树,且node是其父节点的右子节点,则依次往上遍历node的父节点,node的祖父节点。。。直到找到一个节点,该节点是其父节点的左子节点或该节点的父节点为null,则该节点的父节点为所求。

代码如下:

public TreeNode findNextNode(TreeNode node){
        if(node == null){
            return null;
        }
        //如果有右子树
        if(node.right != null){
            TreeNode tempNode = node.right;
            while (tempNode.left != null){
                tempNode = tempNode.left;
            }
            return tempNode;
        }else{//如果没有右子树
            //如果该节点的父节点为空
            if(node.father == null){
                return null;
            }
            //如果该点是其父节点的左子节点
            if(node == node.father.left){
                return node.father;
            }else{//如果该节点是其父节点的右子节点
                TreeNode tempNode = node.father;
                while(tempNode.father != null && tempNode == tempNode.father.right){
                    tempNode = tempNode.father;
                }
                return tempNode.father;
            }
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值