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