Given a binary tree, return the preorder traversal of its nodes’ values.
For example:
Given binary tree{1,#,2,3}
,1 \ 2 / 3return
[1,2,3]
.Note: Recursive solution is trivial, could you do it iteratively?
题目大意:给定一个二叉树。返回它的前序遍历序列。要求使用迭代而不是递归。
思路:使用LIFO的数据结构“栈”来模仿前序遍历的过程。前序遍历顺序为:根->左孩子->右孩子。从栈中弹出节点,若以当前节点为根,则记录根节点的值,然后将它的左右孩子放入栈中以便后面读取。前序遍历先左后右,栈是先进后出,因此先将右孩子放入栈中,再把左孩子放入栈中。重复执行该操作直到栈为空。
Java代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
//使用栈暂存还未确定顺序的节点
Stack<TreeNode> preorderStack = new Stack<TreeNode>();
List<Integer>preorderNum = new ArrayList<Integer>();
if (root == null) {
return preorderNum;
}
preorderStack.push(root);
TreeNode tmpNode;
while (!preorderStack.empty()) {
//弹出当前节点
tmpNode = preorderStack.pop();
preorderNum.add(tmpNode.val);
//先放右孩子,再放左孩子
if (tmpNode.right != null) {
preorderStack.push(tmpNode.right);
}
if (tmpNode.left != null) {
preorderStack.push(tmpNode.left);
}
}
return preorderNum;
}
}