1. 程式人生 > >圖解中序遍歷的線索二叉樹

圖解中序遍歷的線索二叉樹

原理不細講了,參考連結裡有。

  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
    ); }