剑指offer---二叉树的下一个节点

题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结 点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指 针。
思路:若节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指 向左子结点的指针找到的叶子节点即为下一个节点;若节点不是根节点。如果该节 点是其父节点的左孩子,则返回父节点;否则继续向上遍历其父节点的父节点,重 复之前的判断,返回结果。
二叉树结构定义

package Test;
//二叉树
public class TreeNode {
     public int val;
     public TreeNode left;
     public TreeNode right;
     public TreeNode next;//指向上一个节点(父节点)
     public TreeNode(int x) {
         val = x;
     }
}
package Function;
//首先中序遍历的一个结点的下一个节点不可能在左子树上。
// 1.若有右子树则在右子树最左的结点;
// 2.若没有右子树,下一个节点是父节点且必须满足父节点是爷爷结点的左孩子,
// 若有父节点,但不满足父节点是爷爷结点的左孩子,则向上走(pNode=pNode.next),判断爷爷节点是否满足条件,直到满足条件或者没有父节点了,没有父结点返回null
import Test.TreeNode;
public class GetNext08 {
    //任意一个节点pNode
    public TreeNode GetNext(TreeNode pNode) {
        if (pNode == null)
            return null;
        //有右子树
        if (pNode.right != null) {
            pNode = pNode.right;
            //下一个结点为右子树的最左子树
            while (pNode.left != null) {
                pNode = pNode.left;
            }
            return pNode;
        }
        //无右子树 返回自己的父节点
        while (pNode.next != null) {
            // 找 第 一 个 当 前 节 点 是 父 节 点 左 孩 子 的 节 点
            if (pNode.next.left == pNode)
                return pNode.next;
        }
        return null;
    }
    public static void main(String[] args) {
        TreeNode p1=new TreeNode(1);
        TreeNode p2=new TreeNode(2);
        TreeNode p3=new TreeNode(3);
        TreeNode p4=new TreeNode(4);
        TreeNode p5=new TreeNode(5);
        TreeNode p6=new TreeNode(6);
        p1.left=p2;p2.next=p1;
        p1.right=p3;p3.next=p1;
        p2.left=p4;p4.next=p2;
        p2.right=p5;p5.next=p2;
        p3.right=p6;p6.next=p3;
        GetNext08 p=new GetNext08();
        TreeNode m=p.GetNext(p2);
        System.out.println(m.val);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值