二分木のプレオーダー、ミドルオーダー、およびポストオーダートラバーサル

二分木のルートノードルートを指定し、そのノード値のプレオーダー、ミドルオーダー、およびポストオーダートラバーサルを返します。

先序:

再帰コードは次のとおりです。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    
    
    public static List<Integer> preorderTraversal(TreeNode root) {
    
    
        List<Integer> list = new ArrayList<>();
        pre(root, list);
        return list;
    }

    public static void pre(TreeNode root, List<Integer> list) {
    
    
        if (root == null) {
    
    
            return;
        }
        list.add(root.val);
        pre(root.left, list);
        pre(root.right, list);
    }
}

反復:

ステップ:

  1. スタックからノードcurをポップします。
  2. curを印刷します。
  3. 最初にcurの右側の子をスタックにプッシュし、次にcurの左側の子をスタックにプッシュします(存在する場合)
  4. サイクル。
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    
    
    public static List<Integer> preorderTraversal(TreeNode root) {
    
    
        List<Integer> list = new ArrayList<>();
        pre(root, list);
        return list;
    }


    public static void pre(TreeNode root, List<Integer> list) {
    
    
        if (root == null) {
    
    
            return;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()) {
    
    
            TreeNode p = stack.pop();
            list.add(p.val);
            if (p.right != null) {
    
    
                stack.push(p.right);
            }
            if (p.left != null) {
    
    
                stack.push(p.left);
            }
        }
    }
}

ミドルオーダー:

再帰:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    
    
    public List<Integer> inorderTraversal(TreeNode root) {
    
    
        List<Integer> list = new ArrayList<>();
        dfs(root, list);
        return list;
    }

    public static void dfs(TreeNode root, List<Integer> list) {
    
    
        if (root == null) {
    
    
            return;
        }
        dfs(root.left, list);
        list.add(root.val);
        dfs(root.right, list);
    }
}

反復:

ステップ:

まず、ツリー全体の左端をスタックにプッシュし、ノードを順番にポップするプロセスで、印刷して、ノードの右ノードをポップするプロセスを繰り返します。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    
    
    public List<Integer> inorderTraversal(TreeNode root) {
    
    
        List<Integer> list = new ArrayList<>();
        inorder(root, list);
        return list;
    }

    public static void inorder(TreeNode root, List<Integer> list) {
    
    
        if (root == null) {
    
    
            return;
        }
        Stack<TreeNode> stack = new Stack<>();
        while (!stack.isEmpty() || root != null) {
    
    
            if (root != null) {
    
    
                stack.push(root);
                root = root.left;
            } else {
    
    
                root = stack.pop();
                list.add(root.val);
                root = root.right;
            }
        }
    }
}

シーケンス後:

再帰:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    
    
    public List<Integer> postorderTraversal(TreeNode root) {
    
    
        List<Integer> list = new ArrayList<>();
        pre(root, list);
        return list;
    }
    
    public static void pre(TreeNode root, List<Integer> list) {
    
    
        if (root == null) {
    
    
            return;
        }
        pre(root.left, list);
        pre(root.right, list);
        list.add(root.val);
    }
}

反復:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    
    
    public List<Integer> postorderTraversal(TreeNode root) {
    
    
        List<Integer> list = new ArrayList<>();
        postorder(root, list);
        return list;
    }
    
    public static void postorder(TreeNode root, List<Integer> list) {
    
    
        if (root == null) {
    
    
            return;
        }
        Stack<TreeNode> stack1 = new Stack<>();
        Stack<TreeNode> stack2 = new Stack<>();
        stack1.push(root);
        while (!stack1.isEmpty()) {
    
    
            TreeNode p = stack1.pop();
            stack2.push(p);
            if (p.left != null) {
    
    
                stack1.push(p.left);
            }
            if (p.right != null) {
    
    
                stack1.push(p.right);
            }
        }
        while (!stack2.isEmpty()) {
    
    
            list.add(stack2.pop().val);
        }
    }
}

おすすめ

転載: blog.csdn.net/FYPPPP/article/details/110009947