leetcode binary-tree-preorder-traversal(Java)

leetcode题目

binary-tree-preorder-traversal

题目描述

  • Given a binary tree, return the postorder traversal of its nodes’ values.

  • For example:

  • Given binary tree{1,#,2,3},

    1
    \
    2
    /
    3

  • return[1,2,3].

  • Note: Recursive solution is trivial, could you do it iteratively?

思路

1、递归
2、一个栈缓存节点实现

代码

package com.my.test.leetcode.tree;

import java.util.ArrayList;
import java.util.Stack;

/**
 * 题目:
 * binary-tree-preorder-traversal 
 *
 * 题目描述:
 * Given a binary tree, return the preorder traversal of its nodes' values.
 * For example:
 * Given binary tree{1,#,2,3},

   1
    \
     2
    /
   3

 * return[1,2,3].
 * Note: Recursive solution is trivial, could you do it iteratively?
 * 
 */
public class PreOrderTree {

    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) { val = x; }
    }

    /**
     * 递归解法(栈溢出/内存溢出 风险,不推荐)
     */
    public ArrayList<Integer> preorderRecursiveTraversal(TreeNode root) {
        ArrayList<Integer> retList = new ArrayList<>();
        if (root == null) {
            return retList;
        }
        preorderRecursiveTraversal(root, retList);
        return retList;
    }
    
    private void preorderRecursiveTraversal(TreeNode root, ArrayList<Integer> lst) {
        if (root == null) {
            return;
        }
        lst.add(root.val);
        preorderRecursiveTraversal(root.left, lst);
        preorderRecursiveTraversal(root.right, lst);
    }
    
    /**
     * 思路:
     * 1、利用栈缓存元素,初始只包含头节点
     * 2、循环遍历树的元素,每次弹出一个元素,加入当前元素的值到列表中,并加入元素的右、左孩子到栈中
     */
    public ArrayList<Integer> preorderTraversal(TreeNode root) {
        ArrayList<Integer> ret = new ArrayList<>();
        if (root == null) {
            return ret;
        }
        
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        
        TreeNode cur;
        while (!stack.isEmpty()) {
            cur = stack.pop();
            ret.add(cur.val);
            
            // 先加入右孩子,后加入左孩子,弹出时左孩子先出,右孩子后出
            if (cur.right != null) {
                stack.push(cur.right);
            }
            if (cur.left != null) {
                stack.push(cur.left);
            }
        }
        
        return ret;
    }
    
    public static void main(String[] args) {
        TreeNode root = new TreeNode(1);
        TreeNode right = new TreeNode(2);
        root.right = right;
        TreeNode left = new TreeNode(3);
        right.left = left;
        System.out.println(new PreOrderTree().preorderRecursiveTraversal(root));
        System.out.println(new PreOrderTree().preorderTraversal(root));
        
        TreeNode root1 = new TreeNode(3);
        TreeNode left1 = new TreeNode(1);
        root1.left = left1;
        TreeNode right1 = new TreeNode(2);
        root1.right = right1;
        System.out.println(new PreOrderTree().preorderRecursiveTraversal(root1));
        System.out.println(new PreOrderTree().preorderTraversal(root1));
    }
}


更多:
二叉树的先中后序遍历(递归、非递归)

猜你喜欢

转载自blog.csdn.net/zangdaiyang1991/article/details/89338545