再帰と反復を使用してバイナリ ツリーの 3 回の走査を完了する

目次

バイナリ ツリーの事前順序走査

トピック

事前注文トラバーサル トピック リンク

再帰的コード

1. メソッドの値を返すコードを使用します。

2. 戻り値が void のコード

事前順序トラバーサルの非再帰的実装 (スタックスタックを使用) 

1. メソッドの値を返すコードを使用します。

2. 戻り値が void のコード 

バイナリツリーの順序トラバース

トピック

: バイナリ ツリーのルート ノード ルートを指定すると、その順序トラバーサルを返します。

順序トラバーサル トピック リンク

再帰的コード

1. メソッドの値を返すコードを使用します。

2. 戻り値が void のコード

インオーダートラバーサルの非再帰的実装 (スタックスタックを使用) 

1. メソッドの値を返すコードを使用します。

2. 戻り値が void のコード 

バイナリ ツリーの事後走査

トピック

注文後のトラバーサル トピック リンク

再帰的コード

1. メソッドの値を返すコードを使用します。

2. 戻り値が void のコード

インオーダートラバーサルの非再帰的実装 (スタックスタックを使用) 

1. メソッドの値を返すコードを使用します。

2. 戻り値が void のコード

完结撒花✿✿ヽ(°▽°)ノ✿✿


トラバーサル(Traversal)とは、ツリー内の各ノードを一度だけ訪問し、事前順序トラバーサル(事前順序トラバーサルとも呼ばれます)を訪問するために、特定の検索ルートをたどることを指します(事前順序トラバーサルは、ルートノードを訪問します)。 > ルートの左サブツリー ---> ルートの右サブツリー。
インオーダートラバーサル (Inorder Traversal) - ルートの左側のサブツリー ---> ルート ノード ---> ルートの右側のサブツリー。
ポストオーダー トラバーサル (ポストオーダー トラバーサル) - ルートの左側のサブツリー ---> ルートの右側のサブツリー ---> ルート ノード

バイナリ ツリーの事前順序走査

トピック

:バイナリ ツリーのルート ノードを与え 、root そのノード値の 事前順序 走査   を返します。

事前注文トラバーサル トピック リンク

https://leetcode.cn/problems/binary-tree-preorder-traversal/    

再帰的コード

1.メソッドの値を返すコードを使用します。

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> ret = new ArrayList<Integer>();
        if(root==null){
            return ret;
        }
        ret.add(root.val);
        List<Integer> leftTree=preorderTraversal(root.left);
        ret.addAll(leftTree);
        List<Integer> rightTree=preorderTraversal(root.right);
        ret.addAll(rightTree);
        return ret;
        }
}

2.戻り値が void のコード

    // 前序遍历  根  左子树  右子树
    public void preOrder(BTNode root) {
        if (root == null) {
            return;
        }
        System.out.print(root.value + " ");
        preOrder(root.left);
        preOrder(root.right);
    }

事前順序トラバーサルの非再帰的実装 (スタックスタックを使用) 

1.メソッドの値を返すコードを使用します。

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> ret = new ArrayList<>();
        if (root == null) {
            return ret;
        }
        TreeNode cur = root;
        Deque<TreeNode> stack = new ArrayDeque<>();
        while (cur != null || !stack.isEmpty()) {
            while (cur != null) {
                stack.push(cur);
              //System.out.print(cur.val + " ");
                ret.add(cur.val);
                cur = cur.left;
            }
            TreeNode top = stack.pop();
            cur = top.right;
        }
        return ret;
    }
}

2.戻り値が void のコード 

class Solution { 
    public void preOrderNor(BTNode root) {
        if (root == null) {
            return;
        }
        BTNode cur = root;
        Deque<BTNode> stack = new ArrayDeque<>();
        while (cur != null || !stack.isEmpty()) {
            while (cur != null) {
                stack.push(cur);
                System.out.println(cur.value + " ");
                cur = cur.left;
            }
            BTNode top = stack.pop();
            cur = top.right;
        }
    }
}

バイナリツリーの順序トラバース

トピック

: バイナリ ツリーのルート ノードを指定すると root 、 その 順序 トラバーサルを返します 。

順序トラバーサル トピック リンク

: https://leetcode.cn/problems/binary-tree-inorder-traversal/ 

再帰的コード

1.メソッドの値を返すコードを使用します。

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ret = new ArrayList<>();
        if (root == null) {
            return ret;
        }
        List<Integer> leftTree = inorderTraversal(root.left);
        ret.addAll(leftTree);
        ret.add(root.val);
        List<Integer> rightTree =inorderTraversal(root.right);
        ret.addAll(rightTree);
        return ret;
    }
}

2. 戻り値が void のコード

    // 中序遍历  左子树  根  右子树
    public void inOrder(BTNode root) {
        if (root == null) {
            return;
        }
        inOrder(root.left);
        System.out.print(root.value + " ");
        inOrder(root.right);
    }

インオーダートラバーサルの非再帰的実装 (スタックスタックを使用) 

1.メソッドの値を返すコードを使用します。

class Solution{
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ret = new ArrayList<>();
        if (root == null) {
            return ret;
        }
        TreeNode cur = root;
        Deque<TreeNode> stack = new ArrayDeque<>();
        while (cur != null || !stack.isEmpty()) {
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            TreeNode top = stack.pop();
            ret.add(top.val);
            cur = top.right;
        }
        return ret;
    }
}

2. 戻り値が void のコード 

class Solution{    
    public void inOrderNor(BTNode root) {
        if (root == null) {
            return;
        }
        BTNode cur = root;
        Deque<BTNode> stack = new ArrayDeque<>();
        while (cur != null || !stack.isEmpty()) {
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            BTNode top = stack.pop();
            System.out.println(top.value + " ");
            cur = top.right;
        }
    }
}


バイナリ ツリーの事後走査

トピック

:バイナリ ツリーのルート ノードが与えられると root 、 そのノード値の事後探索を 返します。

注文後のトラバーサル トピック リンク

: https://leetcode.cn/problems/binary-tree-postorder-traversal/

再帰的コード

1. メソッドの値を返すコードを使用します。

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> ret = new ArrayList<Integer>();
        if(root==null){
            return ret;
        }
        List<Integer> leftTree = postorderTraversal(root.left);
        ret.addAll(leftTree);
        List<Integer> rightTree = postorderTraversal(root.right);
        ret.addAll(rightTree);
        ret.add(root.val);
        return ret;
     }
}

2. 戻り値が void のコード

    // 后序遍历
    public void postOrder(BTNode root) {
        if (root == null) {
            return;
        }
        postOrder(root.left);
        postOrder(root.right);
        System.out.print(root.value + " ");
    }

インオーダートラバーサルの非再帰的実装 (スタックスタックを使用) 

1.メソッドの値を返すコードを使用します。

class Solution{
     public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> ret = new ArrayList<>();
        if (root == null) {
            return ret;
        }
        TreeNode cur = root;
        TreeNode prev = null;
        Deque<TreeNode> stack = new ArrayDeque<>();
        while (cur != null || !stack.isEmpty()) {
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            TreeNode top = stack.peek();
            if (top.right == null || top.right == prev) {
                //System.out.println(top.value + " ");
                ret.add(top.val);
                stack.pop();
                prev = top;
            } else {
                cur = top.right;
            }
        }
        return ret;
    }
}  

2. 戻り値が void のコード

class Solution{  
    public void postOrderNor(BTNode root) {
        if (root == null) {
            return;
        }
        BTNode cur = root;
        BTNode prev = null;
        Deque<BTNode> stack = new ArrayDeque<>();
        while (cur != null || !stack.isEmpty()) {
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            BTNode top = stack.peek();
            if (top.right == null || top.right == prev) {
                System.out.println(top.value + " ");
                stack.pop();
                prev = top;
            } else {
                cur = top.right;
            }
        }
    }
}

完结撒花✿✿ヽ(°▽°)ノ✿✿

                           

おすすめ

転載: blog.csdn.net/m0_73740682/article/details/132330142