算法与数据结构进阶->二叉树的遍历实现

@我是小爱同学~

树的基本原理

树形结构是一类重要的非线性数据结构,直观来看,树是以分支关系定义的层次结构。

树(Tree) 是n(n>=0)个结点个有限集合,其中每个集合本身又是一棵树。并且成为根的子树。树的结点包含一个数据元素以及若干指向其子树的分支。结点拥有的子树称为结点的。度为0的结点称为叶子结点。度不为0的结点称为分支结点。树种结点的最大层次称为树的深度,而森林(Forest)是m(m>=0)棵互不相交的数的集合。

了解二叉树的原理和性质

 二叉树(Binary tree)是另一种树形结构,他的特点是每一个结点至多只有两棵子树(即二叉树中不存在度大于2的结点)并且,二叉树的子树有左右之分,其次序不能任意颠倒。

二叉树的性质
性质一
在二叉树的第i层上至多有2(i-1)个结点。
性质二
深度为k的二叉树至多有 2k-1个结点。
性质三
对任何一棵二叉树T,如果其终端的结点数为n1,度为2的结点数为n2,则有n1=n2+1。
一棵深度为k且2k-1个结点的二叉树称为满二叉树。当且仅当其每一个结点都与深度为k的满二叉树中编号1~n的结点都一一对应的时候,称为完全二叉树

二叉树的遍历实现

先序遍历二叉树的操作定义为:
若二叉树为空,则空操作;否则
(1)访问根节点;
(2)先序遍历左子树;
(3)先序遍历右子树;
中序遍历,后序遍历操作同上,只是访问遍历的顺序不同。
用代码去实现二叉树的三种遍历如下:

#include <stdio.h>
#include <stdlib.h>
typedef struct bitnode    //二叉链表的存储结构
{
    int data;
    struct bitnode *lchild,*rchild;
}bitnode,*bitree;

void tree(bitree *t)
{
    char ch;
    scanf("%c",&ch);
    if(ch=='#')   //利用#来判断子树是否为NULL 
    {
        *t=NULL;
    }
    else {
        if(!(*t=(bitnode *)malloc(sizeof(bitnode))))
            exit(-2);
        (*t)->data=ch;
        tree(&(*t)->lchild);
        tree(&(*t)->rchild);
    }
}
void visit(char ch)  //输出遍历后的结果 
{
    printf("%c",ch);
}
void firstBT(bitree t)  //先序遍历 
{
    if(t)
    {
        visit(t->data);
        firstBT(t->lchild);
        firstBT(t->rchild);
    }
}
void midBT(bitree t)  //中序遍历 
{
    if(t)
    {
        midBT(t->lchild);
        visit(t->data);
        midBT(t->rchild);
    }
}
void endBT(bitree t)  //后序遍历 
{ 
    if(t)
    {
        endBT(t->lchild);
        endBT(t->rchild);
        visit(t->data);	
	}
        
}
int main()
{
    bitree t1;  //结构体定义t1
    tree(&t1);
    printf("先序遍历:");
    firstBT(t1);
    printf("\n");
    printf("中序遍历:");
    midBT(t1);
    printf("\n");
    printf("后序遍历:");
    endBT(t1);
    return 0;
}

解读一下本程序的结果图~
输入的时候必须满足完全二叉树的性质,即把所有的叶子结点填满,如果节点为空则用‘#’表示。
这个是代码执行的结果

如果有问题与学习方法跟小作者讨论,可以私信或QQ907372669
@[海绵宝宝的菠萝屋]
参考文档

W
E
D
F
#
#
G
F
#
#
R
#
#
#
#

猜你喜欢

转载自blog.csdn.net/qq_45687780/article/details/105629043
今日推荐