前序遍历
思路:先把根结点放进栈,弹出并加入到res.然后判断右结点是否为空,不为空就入栈,再判断左结点。(由于栈是先进后出,而先序遍历是根、左、右。所以应该先把右结点入栈,然后左结点入栈。)最终返回res。
class Solution{
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new LinkedList<Integer>();
if(root!=null){
Deque<TreeNode> stack = new LinkedList<Integer>();
stack.add(root);
while (!stack.isEmpty()){
root = stack.pop();
res.add(root.val);
if(root.right!=null){
stack.push(root.right);
}
if(root.left!=null){
stack.push(root.left);
}
}
}
return res;
}
}
中序遍历
思路:先从根节点,一路遍历到左结点的最深处,直到为null,然后出栈,并加到res中,再判断是否有右子树,如果没有则出栈,并加到res,如果有,则入栈,再次进行判断,直到遍历结束。
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new LinkedList<Integer>();
Deque<TreeNode> stack = new LinkedList<TreeNode>();
while (root != null || !stack.isEmpty()) {
if (root!=null){
stack.push(root);
root = root.left;
}else {
root = stack.pop();
res.add(root.val);
root = root.right;
}
}
return res;
}
}
后序遍历
思路: 跟先序遍历类似(先序遍历是右结点先入栈,然后左结点入栈)
如果先让左结点入栈,然后让右结点入栈。则res中会出现根、右、左的顺序。这时,如果再来一个栈,用来接收根、右、左的顺序,再出栈,则会出现左、右、根,即后序遍历。
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new LinkedList<Integer>();
if(root!=null){
Stack<TreeNode> s1 = new Stack<TreeNode>();
Stack<TreeNode> s2 = new Stack<TreeNode>();
s1.push(root);
while (!s1.isEmpty()){
root = s1.pop();
s2.push(root);
if(root.left!=null){
s1.push(root.left);
}
if(root.right!=null){
s1.push(root.right);
}
}
while (!s2.isEmpty()){
root = s2.pop();
res.add(root.val);
}
}
return res;
}
}

被折叠的 条评论
为什么被折叠?



