二叉树的遍历(上)

Leetcode二叉树的遍历C#代码实现(上)

记录一下学习算法的过程,资料来源leetcode,代码是自己写的。第一次写文章,也是第一次用leetcode,希望自己有进步。

前序遍历(Pre-order Traversal)

先遍历根节点,再遍历左边子节点,最后遍历右边子节点。
在这里插入图片描述

Input: [1,null,2,3]
   1
    \
     2
    /
   3

Output: [1,2,3]
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left;
 *     public TreeNode right;
 *     public TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public IList<int> PreorderTraversal(TreeNode root) {
        List<int> tree = new List<int>();
        if (root != null)
        {            
            tree.Add(root.val);
            foreach(int i in PreorderTraversal(root.left))
                tree.Add(i);
            
            foreach(int i in PreorderTraversal(root.right))
                tree.Add(i);
        }
        return tree;
    }
}

中序遍历(In-order Traversal)

先遍历左边子节点,再遍历根节点,最后遍历右边子节点。在这里插入图片描述

Input: [1,null,2,3]
   1
    \
     2
    /
   3

Output: [1,3,2]
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left;
 *     public TreeNode right;
 *     public TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public IList<int> InorderTraversal(TreeNode root) {
        List<int> tree = new List<int>();
        if (root != null)
        {
            foreach(int i in InorderTraversal(root.left))
            {
                tree.Add(i);
            }
            tree.Add(root.val);
            foreach(int i in InorderTraversal(root.right))
            {
                tree.Add(i);
            }
        }
        return tree;
    }
}

后序遍历(Post-order Traversal)

先遍历左边节点,再遍历右边子节点,最后遍历根节点。
在这里插入图片描述
值得一提的是,当删除一个树的节点时,删除过程是后序遍历的顺序。也就是说,当删除一个节点时,会先删除它的左边子树和右边子树,然后再删除这个节点本身。
而且,后序遍历广泛用于数学表达式。编写程序来解析后序表达式会更容易。比如:在这里插入图片描述
你可以很容易用中序遍历得到原始表达式。
4*(7-2)+5
但是对于一个程序来说并不容易,因为你必须检查运算的优先级。
如果用后序遍历处理这个树,你可以很轻松就用一个栈处理它。当你遇到一个操作符时,就从栈里取两个元素,计算结果然后再把结果放进栈。
这里还没有完全想明白具体是如何进栈出栈的,已经把数据结构全部忘得一干二净了。。。

Input: [1,null,2,3]
   1
    \
     2
    /
   3

Output: [3,2,1]
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left;
 *     public TreeNode right;
 *     public TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public IList<int> PostorderTraversal(TreeNode root) {
        List<int> tree = new List<int>();
        if (root != null)
        {
            foreach(int i in PostorderTraversal(root.left))
            {
                tree.Add(i);
            }
            foreach(int i in PostorderTraversal(root.right))
            {
                tree.Add(i);
            }
            tree.Add(root.val);            
        }
        return tree;
    }
}

leetcode原文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值