LeeCode Practice Journal | Day13_Binary Tree01

题解:
递归遍历:代码随想录 (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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值