剑指offer(8) 二叉树的下一个结点【JAVA】

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-31 00:33:01
package example;

/**
 * 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?
 * 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。
 *
 * @author lvtong
 * @date 2020/1/30
 */
public class Example8 {
    public static void main(String[] args) {
        //创建树
        BinaryTreeNode nodeA = new BinaryTreeNode("a");
        BinaryTreeNode nodeB = new BinaryTreeNode("b");
        BinaryTreeNode nodeC = new BinaryTreeNode("c");
        BinaryTreeNode nodeD = new BinaryTreeNode("d");
        BinaryTreeNode nodeE = new BinaryTreeNode("e");
        BinaryTreeNode nodeF = new BinaryTreeNode("f");
        BinaryTreeNode nodeG = new BinaryTreeNode("g");
        BinaryTreeNode nodeH = new BinaryTreeNode("h");
        BinaryTreeNode nodeI = new BinaryTreeNode("i");

        nodeA.left = nodeB;
        nodeA.right = nodeC;
        nodeA.parent = null;

        nodeB.left = nodeD;
        nodeB.right = nodeE;
        nodeB.parent = nodeA;

        nodeC.left = nodeF;
        nodeC.right = nodeG;
        nodeC.parent = nodeA;

        nodeD.left = null;
        nodeD.right = null;
        nodeD.parent = nodeB;

        nodeE.left = nodeH;
        nodeE.right = nodeI;
        nodeE.parent = nodeD;

        nodeF.left = null;
        nodeF.right = null;
        nodeF.parent = nodeC;

        nodeG.left = null;
        nodeG.right = null;
        nodeG.parent = nodeC;

        nodeH.left = null;
        nodeH.right = null;
        nodeH.parent = nodeE;

        nodeI.left = null;
        nodeI.right = null;
        nodeI.parent = nodeE;


        BinaryTreeNode current = nodeI;
        BinaryTreeNode next = nextBinaryTreeNode(current);
        System.out.println("当前节点:" + current.getValue());
        System.out.println(next == null ? "下一节点:无" : "下一节点:" + next.getValue());
    }

    /**
     * 获取下一个节点
     *
     * @param node 当前节点
     * @return 下一节点
     */
    private static BinaryTreeNode nextBinaryTreeNode(BinaryTreeNode node) {
        if (node == null) {
            System.out.println("当前节点为空");
            return null;
        }
        //当前节点有右子树时,下一节点为右子树的最左节点
        if (node.right != null) {
            node = node.right;
            while (node.left != null) {
                node = node.left;
            }
            return node;
        }
        while (node.parent != null) {
            if (node == node.parent.left) {
                return node.parent;
            }
            node = node.parent;
        }
        return null;

    }

    /**
     * 二叉树节点
     */
    static class BinaryTreeNode {
        String value;
        BinaryTreeNode left;
        BinaryTreeNode right;
        BinaryTreeNode parent;


        private String getValue() {
            return value;
        }

        BinaryTreeNode(String value) {
            this.value = value;
            this.left = null;
            this.right = null;
            this.parent = null;

        }
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!