【剑指offer系列】-08二叉树的下一个节点(关键字:线索化二叉树、中序、遍历线索化二叉树)

public class Main8
{
    public static LineTreeNode pre = null;
    public static int count = 0;

    /**
     * 输入一个节点的值,输出这个节点的中序遍历结果的下一个节点
     * @param root
     * @param list
     * @param k
     * @param count
     */
    private static void printLineTree(LineTreeNode root, List<Integer> list, int k, int count)
    {
        if (root == null) return;
        while (list.size() != count && root != null)//!!!这里加了一个判断,是因为,当所有节点都线索化后存入了List中就可以结束了
        {
            //1.找到最左子树的最左节点
            while (list.size() != count && root.leftType != 0)
            {
                root = root.left;
            }
            list.add(root.val);
            //2.后继节点
            while (list.size() != count && root.rightType == 0)
            {
                list.add(root.right.val);
                root = root.right;
            }
            //3.调整
            root = root.right;
        }
        if (list.get(list.size()-1) == k)return;//!!!最后一个节点没有后继节点
        for (int i = 0; i < list.size(); i++)
        {
            if (k == list.get(i))
            {
                System.out.println(list.get(i+1));//输出种族遍历的下一个节点
                return;
            }
        }
    }

    /**
     * 中序线索化二叉树
     * @param root
     */
    private static void lineTree(LineTreeNode root)
    {
        if (root == null) return;
        //1.线索化左子节点
        lineTree(root.left);
        //2.线索化当前节点
        if (root.left == null)
        {
            root.left = pre;
            root.leftType = 0;
        }
        if (pre != null && pre.right == null)
        {
            pre.right = root;
            pre.rightType = 0;
        }
        pre = root;
        //3.线索化右子节点
        lineTree(root.right);
    }

    /**
     * 前序遍历一下,求出树有多少个节点
     * @param root
     */
    private static void pre(LineTreeNode root)
    {
        if (root == null) return;
        count++;
        pre(root.left);
        pre(root.right);
    }

    public static void main(String[] args)
    {
        LineTreeNode root = new LineTreeNode(1);
        LineTreeNode n1 = new LineTreeNode(3);
        LineTreeNode n2 = new LineTreeNode(6);
        LineTreeNode n3 = new LineTreeNode(8);
        LineTreeNode n4 = new LineTreeNode(10);
        LineTreeNode n5 = new LineTreeNode(14);
        root.left = n1;
        root.leftType = 1;
        root.right = n2;
        root.rightType = 1;
        n1.left = n3;
        n1.leftType = 1;
        n1.right = n4;
        n1.rightType = 1;
        n2.left = n5;
        n2.leftType = 1;
        LineTreeNode countNode = root;
        pre(root);//求节点的个数的
        LineTreeNode temp = root;
        lineTree(temp);//中序线索化二叉树
        printLineTree(root, new ArrayList<Integer>(), new Scanner(System.in).nextInt(),count);//中序遍历线索化后的二叉树,并且找到给定节点的下一个节点
    }
}

class LineTreeNode {
    public int val;
    public LineTreeNode left;
    public int leftType;
    public LineTreeNode right;
    public int rightType;
    public LineTreeNode (int val){
        this.val = val;
    }
}

猜你喜欢

转载自blog.csdn.net/tmax52HZ/article/details/107833815