二叉树的下一份节点8

package swordOffre.gaopengyu;

class TreeNodeWithParent {
    String val;
    TreeNodeWithParent left;
    TreeNodeWithParent right;
    TreeNodeWithParent parent;

    TreeNodeWithParent(String val, TreeNodeWithParent left, TreeNodeWithParent right, TreeNodeWithParent parent) {
        this.val = val;
        this.left = left;
        this.right = right;
        this.parent = parent;
    }
}

public class NextNodeInBST8 {
    public static void main(String[] args) {
        TreeNodeWithParent node9 = new TreeNodeWithParent("i", null, null, null);
        TreeNodeWithParent node8 = new TreeNodeWithParent("h", null, null, null);
        TreeNodeWithParent node7 = new TreeNodeWithParent("g", null, null, null);
        TreeNodeWithParent node6 = new TreeNodeWithParent("f", null, null, null);
        TreeNodeWithParent node5 = new TreeNodeWithParent("e", node8, node9, null);
        TreeNodeWithParent node4 = new TreeNodeWithParent("d", null, null, null);
        TreeNodeWithParent node3 = new TreeNodeWithParent("c", node6, node7, null);
        TreeNodeWithParent node2 = new TreeNodeWithParent("b", node4, node5, null);
        TreeNodeWithParent node1 = new TreeNodeWithParent("a", node2, node3, null);
        node2.parent = node1;
        node3.parent = node1;
        node4.parent = node2;
        node5.parent = node2;
        node6.parent = node3;
        node7.parent = node3;
        node8.parent = node5;
        node9.parent = node5;
//        TreeNodeWithParent result = findNextNodeInBSTInOrder(node1);
//        TreeNodeWithParent result = findNextNodeInBSTInOrder(node4);
        TreeNodeWithParent result = findNextNodeInBSTInOrder(node9);
        System.out.println(result.val);
    }

    public static TreeNodeWithParent findNextNodeInBSTInOrder(TreeNodeWithParent node) {
//        右子树不空的情况下,右子树的最左节点就是二叉树中序遍历的下一份节点
        if (node.right != null) {
            node = node.right;
            while (node.left != null) {
                node = node.left;
            }
            return node;
        }
//        右子树为空,并且这个节点是父节点的左子节点的情况下,父节点就是二叉树中序遍历的下一份节点
        if (node.right == null && node.parent.left == node) {
            return node.parent;
        }
//        右子树为空,并且这个节点是父节点的右子节点的情况下,向上找第一个是它父节点的左子节点的节点,就是二叉树中序遍历的下一份节点
        while (node.parent == node.parent.parent.right) {
            node = node.parent;
        }
        return node.parent.parent;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值