二叉树sdutoj1303

本文介绍了一种使用先序遍历构建二叉树的方法,并演示了中序与后序遍历的实现过程。此外,还提供了计算二叉树叶子节点数量及树深度的函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2137&cid=1303

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
    char c;
    struct node *r,*l;
};
struct node* xianb(struct node *tree)//先序建树
{
    char ch;
    scanf("%c",&ch);
    if(ch==',')tree=NULL;
    else{
        tree=(struct node *)malloc(sizeof(struct node));
        tree->c=ch;
        tree->l=xianb(tree->l);
        tree->r=xianb(tree->r);
    }
    return tree;
}
void putzhong(struct node *tree)
{
    if(tree!=NULL)
    {
        putzhong(tree->l);
        printf("%c",tree->c);
        putzhong(tree->r);
    }
}
void puthou(struct node *tree)
{
    if(tree!=NULL)
    {
        puthou(tree->l);
        puthou(tree->r);
        printf("%c",tree->c);
    }
}
int sum;
void ye(struct node *tree)//求叶子个数
{
    if(tree==NULL)return ;
    if(tree->l==NULL&&tree->r==NULL)
    {
        sum++;
    }
    ye(tree->l);
    ye(tree->r);
}
int depth(struct node*tree)//求深度
{
    int dr,dl;
    if(tree==NULL)return 0;
    else
    {
        dl=depth(tree->l);
        dr=depth(tree->r);
        return (dl>dr?dl:dr)+1;
    }
}
int main()
{
    struct node *tree;
    tree=xianb(tree);//有tree未定义的警告,但代码是对的,警告可忽略
    putzhong(tree);
    printf("\n");
    puthou(tree);
    printf("\n");
    sum=0;
    ye(tree);
    printf("%d\n",sum);
    printf("%d\n",depth(tree));
    return 0;
}


### SWUST OJ 平台上的二叉树题目解法 在解决与二叉树相关的编程问题时,通常会涉及以下几个方面:二叉树的构建、遍历(前序、中序、后序)、层次遍历以及特定操作(如求高度、判断平衡性等)。以下是基于常见二叉树问题的一些通用解决方案。 #### 构建二叉树 可以通过数组或链表来表示一棵二叉树。以下是一个通过先序序列和中序序列重建二叉树的例子: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def build_tree(preorder, inorder): if not preorder or not inorder: return None root_val = preorder[0] root_index_in_inorder = inorder.index(root_val) root = TreeNode(root_val) root.left = build_tree( preorder[1:root_index_in_inorder + 1], inorder[:root_index_in_inorder] ) root.right = build_tree( preorder[root_index_in_inorder + 1:], inorder[root_index_in_inorder + 1:] ) return root ``` 此方法利用了递归来实现二叉树的构建[^2]。 #### 遍历二叉树 常见的二叉树遍历方式有三种:前序遍历、中序遍历和后序遍历。下面展示如何实现这些遍历算法。 ##### 前序遍历 ```python def pre_order_traversal(root): result = [] def dfs(node): if node is None: return result.append(node.val) # 访问当前节点 dfs(node.left) # 左子树 dfs(node.right) # 右子树 dfs(root) return result ``` ##### 中序遍历 ```python def in_order_traversal(root): result = [] def dfs(node): if node is None: return dfs(node.left) # 左子树 result.append(node.val) # 访问当前节点 dfs(node.right) # 右子树 dfs(root) return result ``` ##### 后序遍历 ```python def post_order_traversal(root): result = [] def dfs(node): if node is None: return dfs(node.left) # 左子树 dfs(node.right) # 右子树 result.append(node.val) # 访问当前节点 dfs(root) return result ``` 以上代码展示了如何使用深度优先搜索 (DFS) 来完成不同类型的遍历[^3]。 #### 判断二叉树的高度 计算二叉树的高度可以帮助我们了解其结构特性。 ```python def max_depth(root): if root is None: return 0 left_height = max_depth(root.left) right_height = max_depth(root.right) return max(left_height, right_height) + 1 ``` 这段代码采用递归的方法逐步向下探索直到叶子节点,并返回最大路径长度加一作为最终结果[^4]。 #### 检查是否为平衡二叉树 平衡二叉树是指任何节点的两棵子树之间的高度差不超过1。 ```python def is_balanced(root): def check_balance(node): if node is None: return True, 0 left_balanced, left_height = check_balance(node.left) if not left_balanced: return False, 0 right_balanced, right_height = check_balance(node.right) if not right_balanced: return False, 0 balanced = abs(left_height - right_height) <= 1 height = max(left_height, right_height) + 1 return balanced, height balanced, _ = check_balance(root) return balanced ``` 上述函数不仅验证了整个树是否满足条件还同时获取到了各部分的高度信息以便进一步处理[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值