题解:
递归遍历:代码随想录 (programmercarl.com)
迭代遍历:代码随想录 (programmercarl.com)
统一迭代:代码随想录 (programmercarl.com)
层序遍历:代码随想录 (programmercarl.com)
144.二叉树的前序遍历
题目:144. 二叉树的前序遍历 - 力扣(LeetCode)
前序顺序:中左右
递归简单,迭代在三种顺序里是最简单的
solution
递归
public class Solution {
public List<int> result = new List<int>();
public IList<int> PreorderTraversal(TreeNode root) {
recursionTraversal(root);
return result;
}
//recursion
public void recursionTraversal(TreeNode root)
{
if(root == null) return;
result.Add(root.val);
recursionTraversal(root.left);
recursionTraversal(root.right);
}
}
迭代
public class Solution {
public List<int> result = new List<int>();
public IList<int> PreorderTraversal(TreeNode root) {
if (root == null) return result;
iterateTraversal(root);
return result;
}
//Iterate
public void iterateTraversal(TreeNode root)
{
Stack<TreeNode> stk = new Stack<TreeNode>();
TreeNode temp = new TreeNode();
stk.Push(root);
while(stk.Count > 0)
{
temp = stk.Pop();
result.Add(temp.val);
if(temp.right != null) stk.Push(temp.right);
if(temp.left != null) stk.Push(temp.left);
}
}
}
统一迭代
summary
错误
迭代法:push结点的时候没有判断是否为空
145.二叉树的后序遍历
题目:145. 二叉树的后序遍历 - 力扣(LeetCode)
后序顺序:左右中
solution
递归
public class Solution {
public List<int> result = new List<int>();
public IList<int> PostorderTraversal(TreeNode root) {
recursionTraversal(root);
return result;
}
public void recursionTraversal(TreeNode root)
{
if(root == null) return;
recursionTraversal(root.left);
recursionTraversal(root.right);
result.Add(root.val);
}
}
迭代
public class Solution {
public IList<int> PostorderTraversal(TreeNode root) {
List<int> result = new List<int>();
if (root == null) return result;
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode current = root;
TreeNode lastVisited = null;
while (current != null || stack.Count > 0) {
while (current != null) {
stack.Push(current);
current = current.left;
}
TreeNode peekNode = stack.Peek();
// If right node is null or already visited
if (peekNode.right == null || peekNode.right == lastVisited) {
stack.Pop();
result.Add(peekNode.val);
lastVisited = peekNode;
} else {
current = peekNode.right;
}
}
return result;
}
}
统一迭代
94.二叉树的中序遍历
题目:94. 二叉树的中序遍历 - 力扣(LeetCode)
中序顺序:左中右
递归简单,迭代真的不好想
solution
递归
public class Solution {
public List<int> result = new List<int>();
public IList<int> InorderTraversal(TreeNode root) {
recursionTraversal(root);
return result;
}
//recursion
public void recursionTraversal(TreeNode root)
{
if(root == null) return;
recursionTraversal(root.left);
result.Add(root.val);
recursionTraversal(root.right);
}
}
迭代
public class Solution {
public List<int> result = new List<int>();
public IList<int> InorderTraversal(TreeNode root) {
iterateTraversal(root);
return result;
}
//iterate
public void iterateTraversal(TreeNode root)
{
if (root == null) return;
Stack<TreeNode> stk = new Stack<TreeNode>();
TreeNode cur = root;
while(cur != null || stk.Count > 0)
{
while(cur != null)
{
stk.Push(cur);
cur = cur.left;
}
cur = stk.Pop();
result.Add(cur.val);
cur = cur.right;
}
}
}
统一迭代
前/中/后序遍历summary
递归较为简单,省略
迭代逻辑图示
102.二叉树的层序遍历
题目:102. 二叉树的层序遍历 - 力扣(LeetCode)
题解:代码随想录 (programmercarl.com)
比较简单
solution
public class Solution {
List<IList<int>> result = new List<IList<int>>();
public IList<IList<int>> LevelOrder(TreeNode root) {
if (root == null) return result;
Queue<TreeNode> queue = new Queue<TreeNode>();
queue.Enqueue(root);
TreeNode cur = root;
while(queue.Count > 0)
{
int n = queue.Count;
List<int> list = new List<int>();
for(int i = 0; i < n; i ++)
{
cur = queue.Dequeue();
list.Add(cur.val);
if(cur.left != null) queue.Enqueue(cur.left);
if(cur.right != null) queue.Enqueue(cur.right);
}
result.Add(list);
}
return result;
}
}