C# 二叉树的综合操作(一):查找、插入、最大(小)值、先序遍历、后序遍历及中序遍历

    二叉树是学习数据结构与算法的重要内容,现做综合操作二叉树的汇总。由于关于这方面的文章、书籍已是随处可见,故此间的细节不再赘述,附上一段代码,并提供实例,供参考。代码已测试没有问题。

    public class Node                             // 定义二叉树节点类 Node
    {
        public int Data;
        public Node Left;
        public Node Right;
        public void Display()
        {
            Console.WriteLine(Data);
        }
        public Node(int x)
        {
            Data = x;
        }
    }
    public class BinaryTree              // 定义二叉树
    {
        public Node Current;             // 
        Node Parent;                     // 定义一个 Parent,用于存储当前节点(Current)的父节点,为添加删除节点方法做准备
        public Node Root;                // 定义根结点
        public BinaryTree()              // 构造函数,初始化二叉树
        {
            Root = null;
        }
        public void InOrder(Node theRoot)            // 通过递归,中序遍历
        {
            if (theRoot != null)
            {
                InOrder(theRoot.Left);
                Console.Wr
我们使用 **二叉链表存储结构**(即每个节点包含数据域和左右指针)来实现二叉树。根据题目要求,输入是按照 **序遍历顺序输入字符**,其中 `#` 表示空节点。 ### 思路: - 使用递归方式根据序序列重建二叉树。 - 然后分别进行序、中序、后序遍历输出。 - 遍历时统计节点总数。 --- ```python class TreeNode: def __init__(self, val=0): self.val = val self.left = None self.right = None def build_tree(preorder_iter): """根据序遍历的迭代器构造二叉树""" try: ch = next(preorder_iter) except StopIteration: return None if ch == '#': return None # 空节点 root = TreeNode(ch) root.left = build_tree(preorder_iter) # 构建左子树 root.right = build_tree(preorder_iter) # 构建右子树 return root def preorder(root, res): """序遍历:根 -> 左 -> 右""" if root is None: return res.append(root.val) preorder(root.left, res) preorder(root.right, res) def inorder(root, res): """中序遍历:左 -> 根 -> 右""" if root is None: return inorder(root.left, res) res.append(root.val) inorder(root.right, res) def postorder(root, res): """后序遍历:左 -> 右 -> 根""" if root is None: return postorder(root.left, res) postorder(root.right, res) res.append(root.val) def count_nodes(root): """计算二叉树节点总数""" if root is None: return 0 return 1 + count_nodes(root.left) + count_nodes(root.right) # 主程序 if __name__ == "__main__": # 输入序序列 line = input().strip() preorder_chars = iter(line) # 构建二叉树 tree_root = build_tree(preorder_chars) # 存储三种遍历结果 pre_result = [] in_result = [] post_result = [] # 进行三种遍历 preorder(tree_root, pre_result) inorder(tree_root, in_result) postorder(tree_root, post_result) # 输出结果 print(''.join(pre_result)) print(''.join(in_result)) print(''.join(post_result)) print(count_nodes(tree_root)) ``` --- ### 解释: 1. **TreeNode 类**:定义了二叉树节点结构,包含 `val` 和左右孩子指针。 2. **build_tree 函数**: - 使用 `iter()` 将输入字符串转为迭代器,逐个读取字符。 - 每次 `next()` 获取个字符,如果是 `#` 返回 `None` 表示空节点。 - 否则创建新节点,并递归构建左右子树。 3. **三种遍历函数**: - 均采用递归实现,将访问结果存入列表。 4. **count_nodes 函数**: - 递归统计节点数量。 5. **主程序流程**: - 读取输入 → 构造树 → 遍历输出 → 统计并输出节点数。 --- #### 示例输入: ``` ABD##E##C## ``` #### 对应的二叉树结构: ``` A / \ B C / \ D E ``` #### 输出: ``` ABDECD DBEAC DEBCA 5 ``` > 注意:实际输出取决于输入顺序,请确保输入格式正确。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值