二叉树的基本算法

本文详细介绍了二叉树的基本算法,包括以括号形式输出二叉树,二叉树的遍历操作,以及如何计算二叉树的深度。虽然未涉及多叉树的遍历,但提供了相关资源链接。代码示例展示了具体实现过程。
摘要由CSDN通过智能技术生成


以括号形式输出二叉树

输入一个二叉树的先序串,输出以括号形式表示的而叉树。如果结点的子树为空,先序串的对应位置为空格符。

Input

第1行:先序串 (结点数≤26,以单个大写字母表示)

Output

第1行:二叉树的括号形式

Sample Input

AB C  D  

Sample Output

A(B( ,C( , )),D( , ))

Code

#include<cstdio>
#include<cstring>
char s[100];
int len,x;
void dg()
{
    printf("%c",s[x]);
    if(s[x]==' ')return;
    printf("(");
    x++;
    dg();
    printf(",");
    x++;
    dg();
    printf(")");
}
int main()
{
    gets(s);
    len=strlen(s);
    dg();
    return 0;
}

由于这里只讲二叉树,所以没有多叉树的遍历,但我推荐一个博客,里面面有多叉树的遍历方法(其实多叉树和二叉树的遍历差不多)。
多叉树的遍历

二叉树的遍历

给出一棵二叉树,分别输出先序、中序、后序遍历结果。

Input

第1行:结点数n(1<=n<=100)
以下若干行,每行3个整数,分别表示父结点、左孩子、右孩子。若没有孩子,对应的整数为0.

Output

第1行:树根
第2行:先序遍历结果,数字间用1个空格分开。
第3行:中序遍历结果,数字间用1个空格分开。
第4行:后序遍历结果,数字间用1个空格分开。

Smple Input

8
1 2 4
2 0 0
4 8 0
3 1 5
5 6 0
6 0 7
8 0 0
7 0 0

Sample Output

3
3 1 2 4 8 5 6 7
2 1 8 4 3 6 7 5
2 8 4 1 7 6 5 3

Code

#include<cstdio>
int n,root,ll;//ll行末多余空格,root根节点
struct shu
{
    int p,l,r;
    //p存父亲,l存左儿子,r存右儿子
}t[105];
void first(int x)
{
    if(x==0)return;//没有儿子(叶节点)
    ll++;
    if(ll==n) printf("%d\n",x);//行末
    else printf("%d ",x);
    first(t[x].l);//递归左儿子
    first(t[x].r);//递归右儿子
}
void middle(int x)
{   
    if(x==0)return;
    middle(t[x].l);//递归左儿子
    ll++;
    if(ll==n) printf("%d\n",x);
    else printf("%d ",x);
    middle(t[x].r);//递归右儿子
}
void last(int x)
{
    if(x==0)return;
    last(t[x].l);
    last(t[x].r);
    ll++;
    if(ll==n) printf("%d\n",x);
    else printf("%d ",x);
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        t[y].p=t[z].p=x;//预处理
        t[x].l=y;
        t[x].r=z;
    }
    for(int i=1;i<=n;i++)//找根节点
        if(t[i].p==0) root=i;
    printf("%d\n",root);
    first(root);ll=0;//先序
    middle(root);ll=0;//中序
    last(root);//后序
    return 0;   
}

求二叉树的深度

给出一棵二叉树,求该二叉树的深度。

Input

第一行给出节点个数n。(n<100)
接下来n行,每行给出两个数。依次表示节点1到节点n的左儿子和右儿子。如果左儿子为0,表示没有左儿子,如果右儿子为0,表示没有右儿子

Output

一个整数,表示二叉树的深度。

Sample Input

7
2 3
4 5
6 7
0 0
0 0
0 0
0 0

Sample Output

3

Code

#include<cstdio>
int n,ans,rot,mx=-1;//mx存树的深度,ans存递归时节点深度
struct shu
{
    int l,r,p;//储存二叉树
}a[105];
void ser(int x,int ans)//递归求深度
{
    if(x==0)return;//倒底之后返回
    if(ans>mx)mx=ans;//存最大深度,因为那才是树的深度
    ser(a[x].l,ans+1);//左子树
    ser(a[x].r,ans+1);//右子树
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&a[i].l,&a[i].r);//存儿子
        a[a[i].l].p=a[a[i].r].p=i;//存父亲
    }
    for(int i=1;i<=n;i++)
        if(!a[i].p){rot=i;break;}//存根节点
    ser(rot,1);//求深度
    printf("%d\n",mx);
    return 0;
}

多叉树转二叉树

平衡二叉树是一种特殊的二叉搜索树,它具有以下特点: 1. 左子树和右子树的高度差不超过 1; 2. 左子树和右子树都是平衡二叉树。 常见的平衡二叉树有 AVL 树、红黑树等。 平衡二叉树基本算法验证包括以下部分: 1. 插入节点:在插入节点时,需要保证插入后树仍然是平衡的。具体操作是:首先按照二叉搜索树的插入方法将节点插入到树中,然后从插入节点开始向上逐层检查,如果检查到某个节点不平衡,就进行旋转操作,使得该节点重新平衡。旋转操作包括左旋、右旋、左右旋和右左旋四种,具体实现可参考 AVL 树、红黑树等平衡二叉树的旋转操作; 2. 删除节点:在删除节点时,同样需要保证删除后树仍然是平衡的。具体操作是:先按照二叉搜索树的删除方法将节点删除,然后从删除节点的父节点开始向上逐层检查,如果检查到某个节点不平衡,就进行旋转操作,使得该节点重新平衡; 3. 查找节点:在平衡二叉树中查找节点的方法与二叉搜索树相同,具体操作是从根节点开始,比较待查找节点与当前节点的大小关系,然后根据比较结果向左子树或右子树遍历,直到找到目标节点或遍历到叶子节点为止。 以上就是平衡二叉树基本算法验证的内容。需要注意的是,不同的平衡二叉树可能存在一些细微的差异,具体实现时需要结合具体的平衡二叉树来进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值