图解中序遍历的线索二叉树

参考链接:
线索二叉树原理及前序、中序线索化(Java版)

原理不细讲了,参考链接里有。

  1. 以下图所示的二叉树为例:
    这里写图片描述

  2. 中序遍历的结果:
    这里写图片描述

  3. 中序遍历的线索二叉树:
    这里写图片描述
    虚线箭头为线索指针,对于所有左指针指向空的节点:将该节点的左指针指向该节点在中序遍历中的上一节点;对于所有右指针指向空的节点,将该节点的右指针指向该节点在中序遍历中的下一结点。

  4. 线索二叉树的中序遍历结果:
    这里写图片描述
    即形成了一个特殊的双向链表,之所以特殊,以6–>5为例,6–>5并不是直接到达,而是通过6–>2–>4–>5间接到达。

  5. 中序遍历的Java实现:

    public static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        boolean isLeftThread;
        boolean isRightThread;
    
        TreeNode(int val) {
            this.val = val;
        }
    }
    
    public void inOrder(TreeNode node) {
        if (node == null) {
            return;
        }
        inOrder(node.left);
        System.out.println(node.val);
        inOrder(node.right);
    }
  6. 参考中序遍历的代码,再看线索中序遍历的Java实现:

    private TreeNode mPreNode;
    
    public void inThreadOrder(TreeNode node) {
        if (node == null) {
            return;
        }
        inThreadOrder(node.left);
        if (node.left == null) {
            node.left = mPreNode;
            node.isLeftThread = true;
        }
        if (mPreNode != null && mPreNode.right == null) {
            mPreNode.right = node;
            mPreNode.isRightThread = true;
        }
        mPreNode = node;
        inThreadOrder(node.right);
    }

猜你喜欢

转载自blog.csdn.net/KevinsCSDN/article/details/80689161