目录
一、前序遍历
递归
迭代
二、中序遍历
递归
迭代
三、后序遍历
递归
迭代
先说一个无语事件,这篇文章我是原创,但是怎么样也不能通过原创审核,只能标一个转载,好气-_-
使用递归遍历树,结束条件是树的根节点为空。通过List存储每个遍历经过的节点的值。
class Solution {
public List preorderTraversal(TreeNode root) {
List ans = new ArrayList<>();
if(root == null) {
return ans;
}
preOrder(root,ans);
return ans;
}
public void preOrder(TreeNode root, List ans) {
if(root == null) {
return;
}
ans.add(root.val);
preOrder(root.left,ans);
preOrder(root.right,ans);
}
}
定义一个暂时的节点遍历树。当遍历左子树时,将节点放入栈中,当栈中节点为空时,转换为该节点的右子树进行遍历。当栈中元素为空,且暂时节点遍历完树后,循环结束。过程中需要用List进行节点值记录。
class Solution {
public List preorderTraversal(TreeNode root) {
List ans = new ArrayList<>();
if(root == null) {
return ans;
}
TreeNode cur = root;
Stack stack = new Stack<>();
while(cur != null || !stack.isEmpty()) {//循环条件
while(cur != null) {//表明当前左子树有节点
stack.push(cur);
ans.add(cur.val);
cur = cur.left;
}
TreeNode top = stack.pop();//换成右子树
cur = top.right;
}
return ans;
}
}
class Solution {
public List inorderTraversal(TreeNode root) {
List ans = new ArrayList<>();
if(root == null) {
return ans;
}
inOrder(root, ans);
return ans;
}
public void inOrder(TreeNode root, List ans) {
if(root == null) {
return;
}
inOrder(root.left, ans);
ans.add(root.val);
inOrder(root.right, ans);
}
}
需要注意的是此时 List 记录树节点的值的位置。
class Solution {
public List inorderTraversal(TreeNode root) {
List ans = new ArrayList<>();
Stack stack = new Stack<>();
if(root == null) {
return ans;
}
TreeNode cur = root;
while(cur != null || !stack.isEmpty()) {
while(cur != null) {
stack.push(cur);
cur = cur.left;
}
TreeNode top = stack.pop();
ans.add(top.val);
cur = top.right;
}
return ans;
}
}
class Solution {
public List postorderTraversal(TreeNode root) {
List ans = new ArrayList<>();
if(root == null) {
return ans;
}
postOrder(root,ans);
return ans;
}
public void postOrder(TreeNode root, List ans) {
if(root == null) {
return;
}
postOrder(root.left,ans);
postOrder(root.right,ans);
ans.add(root.val);
}
}
注意后序遍历时需要先用一个变量保存此时根节点的值,来判断此时是否有右节点。
class Solution {
public List postorderTraversal(TreeNode root) {
List ans = new ArrayList<>();
if(root == null) {
return ans;
}
TreeNode cur = root;
TreeNode prev = null;
Stack stack = new Stack<>();
while(cur != null || !stack.isEmpty()) {
while(cur != null) {
stack.push(cur);
cur = cur.left;
}
cur = stack.peek();
if(cur.right == null || cur.right == prev) {
ans.add(stack.pop().val);
prev = cur;
cur = null;
}else {
cur = cur.right;
}
}
return ans;
}
}