1: 前序遍历
1.1 思路
1: 入栈root
2: 对于栈里的每个元素我们做以下处理 首先加入结果 然后加入右孩子,最后加入左孩子。
1.2 代码
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
if(root == null) return result;
Stack<TreeNode> stk = new Stack<>();
stk.push(root);
while(!stk.isEmpty()){
TreeNode temp = stk.pop();
result.add(temp.val);
if(temp.right != null) stk.push(temp.right);
if(temp.left != null) stk.push(temp.left);
}
return result;
}
}
2:中序遍历
2.1 思路
定义指针cur 指向 root
终止条件为cur 为空且栈里没有元素
cur要做的就是首先一直采左孩子
当没有左孩子的时候,我们取一个栈里的元素,然后由于它的左孩子已经被采完了,所以我们找它的右孩子,右孩子非空就采他的左孩子,右孩子为空就继续取栈里的元素,取出后继续循环直到cur为空,且栈里的元素也取完了
3.2 代码
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> res = new ArrayList<>();
if (root == null) return res;
Stack<TreeNode> stk = new Stack<>();
//cur指向root
TreeNode cur = root;
while (cur != null || !stk.isEmpty()) {
//往左采左孩子
if (cur != null) {
stk.push(cur);
cur = cur.left;
//左孩子采光了或者取了一个栈里的元素但是发现他没有右孩子了所以继续取栈里的元素
} else {
cur = stk.pop();
res.add(cur.val);
cur = cur.right;
}
}
return res;
}
}