问题描述
- Given a binary tree, return the preorder traversal of its nodes’ values.
- 地址
问题分析
- 如何先序遍历左子树
- 递归法
- 非递归
- 法1:教科书法
稍微改变一下打印顺序,前序中序便通用 - 法2:
当某节点出栈时,便打印,然后将它的右孩子,左孩子(若不为空)压栈,注意先右后左 - 法3 : 金手指法
完全模拟递归时系统栈的状态,用一个类(指令)来表征当前节点是打印还是遍历。可以改变指令指令入栈顺序,来实现前序,中序,后序遍历。
代码实现
public void preorderTraversal(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
res.add(root.val);
preorderTraversal(root.left, res);
preorderTraversal(root.right, res);
}
public List<Integer> preorderTraversal(TreeNode root) {
if (root == null) {
return new ArrayList<Integer>();
}
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode curNode = root;
while (curNode != null || ! stack.isEmpty()) {
while (curNode != null) {
stack.push(curNode);
res.add(curNode.val);
curNode =curNode.left;
}
curNode = stack.pop();
curNode = curNode.right;
}
return res;
}
public List<Integer> preorderTraversal(TreeNode root) {
if (root == null) {
return new ArrayList<Integer>();
}
Stack<TreeNode> stack = new Stack<>();
List<Integer> res = new ArrayList<>();
stack.push(root);
while(! stack.isEmpty()) {
TreeNode popNode = stack.pop();
res.add(popNode.val);
if (popNode.right != null) {
stack.push(popNode.right);
}
if (popNode.left != null) {
stack.push(popNode.left);
}
}
return res;
}
public List<Integer> preorderTraversal(TreeNode root) {
if (root == null) {
return new ArrayList<Integer>();
}
List<Integer> res = new ArrayList<>();
Stack<Command> stack = new Stack<>();
stack.push(new Command(false, root));
while(! stack.isEmpty()) {
Command curCommand = stack.pop();
TreeNode curRoot = curCommand.root;
if (curCommand.isPrint) {
res.add(curRoot.val);
}else {
if (curRoot.right != null) {
stack.push(new Command(false, curRoot.right));
}
if (curRoot.left != null) {
stack.push(new Command(false, curRoot.left));
}
stack.push(new Command(true, curRoot));
}
}
return res;
}
class Command{
boolean isPrint;
TreeNode root;
public Command(boolean isPrint, TreeNode root) {
this.isPrint = isPrint;
this.root = root;
}
}