题8:二叉树的下一个节点

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

  1. 如果给定的节点有右子树,那么它的右子树的最左节点就是下一个节点,例如 a 的下一个节点为 f ;b 的下一个节点为 h
  2. 如果给定的节点没有右子树
    1. 如果该节点是其父节点的左子节点,那么下一个节点为父节点,例如:f 的下一个节点为 c ;d 的下一个节点为 b
    2. 如果该节点是其父节点的右子节点,那么需要一直往上遍历,找到一个节点是其父节点的左子节点,这个父节点是下一个节点,例如:i 的下一个节点为 a
    3. 遍历到根节点都没有找到符合条件的节点,就是没有没有下一个节点

第一个测试:dbheiafcg
在这里插入图片描述
第二个测试:DCBA
在这里插入图片描述

第三个测试:aa bb cc dd
在这里插入图片描述

package offer.tree;


public class NextNode {

    public static class TreeLinkNode {
        String val;
        TreeLinkNode left = null;
        TreeLinkNode right = null;
        TreeLinkNode parent = null;

        TreeLinkNode(String val) {
            this.val = val;
        }
    }


    public static TreeLinkNode GetNext(TreeLinkNode node) {

        if(node == null){
            return null;
        }

		//有右子树,找左子树的最左节点
        if(node.right != null){
            TreeLinkNode temp = node.right;
            while(temp.left != null){
                temp = temp.left;
            }
            return temp;
        }else{
        	//没有右子树,一直往上找,找到父节点的左节点是自身的节点
            TreeLinkNode parent = node.parent;
            TreeLinkNode temp = node;
            while(parent != null && parent.left != temp){
                temp = temp.parent;
                parent = temp.parent;
            }
            return parent;
        }

    }


    //test
    public static void  main(String[] args){
        
        //第一个测试
        TreeLinkNode a = new TreeLinkNode("a");
        TreeLinkNode b = new TreeLinkNode("b");
        TreeLinkNode c = new TreeLinkNode("c");
        TreeLinkNode d = new TreeLinkNode("d");
        TreeLinkNode e = new TreeLinkNode("e");
        TreeLinkNode f = new TreeLinkNode("f");
        TreeLinkNode g = new TreeLinkNode("g");
        TreeLinkNode h = new TreeLinkNode("h");
        TreeLinkNode i = new TreeLinkNode("i");
        
        a.left = b;
        a.right = c;
        a.parent = null;

        b.left = d;
        b.right = e;
        b.parent = a;

        c.left = f;
        c.right = g;
        c.parent = a;

        d.left = null;
        d.right = null;
        d.parent = b;

        e.left = h;
        e.right = i;
        e.parent = b;

        f.left = null;
        f.right = null;
        f.parent = c;

        g.left = null;
        g.right = null;
        g.parent = c;

        h.right = null;
        h.left = null;
        h.parent = e;

        i.left = null;
        i.right = null;
        i.parent = e;

        System.out.println( GetNext(a).val);
        System.out.println( GetNext(b).val);
        System.out.println( GetNext(c).val);
        System.out.println( GetNext(d).val);
        System.out.println( GetNext(e).val);
        System.out.println( GetNext(f).val);
        System.out.println( GetNext(g));
        System.out.println( GetNext(h).val);
        System.out.println( GetNext(i).val);

        System.out.println("==========");

		//第二个测试
        TreeLinkNode A = new TreeLinkNode("A");
        TreeLinkNode B = new TreeLinkNode("B");
        TreeLinkNode C = new TreeLinkNode("C");
        TreeLinkNode D = new TreeLinkNode("D");

        A.left = B;
        A.parent = null;
        A.right = null;

        B.left = C;
        B.parent = A;
        B.right = null;

        C.left = D;
        C.parent = B;
        C.right = null;

        D.left = null;
        D.parent = C;
        D.right = null;

        System.out.println(GetNext(A));
        System.out.println(GetNext(B).val);
        System.out.println(GetNext(C).val);
        System.out.println(GetNext(D).val);

        System.out.println("==========");

		//第三个测试
        TreeLinkNode aa = new TreeLinkNode("aa");
        TreeLinkNode bb = new TreeLinkNode("bb");
        TreeLinkNode cc = new TreeLinkNode("cc");
        TreeLinkNode dd = new TreeLinkNode("dd");

        aa.parent = null;
        aa.right = bb;
        aa.left = null;

        bb.parent = aa;
        bb.right = cc;
        bb.left = null;

        cc.parent = bb;
        cc.right = dd;
        cc.left = null;

        dd.parent = cc;
        dd.right = null;
        dd.left = null;

        System.out.println(GetNext(aa).val);
        System.out.println(GetNext(bb).val);
        System.out.println(GetNext(cc).val);
        System.out.println(GetNext(dd));
        
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值