数据结构与算法回炉重造 -- (八)

版权声明:本文为博主原创文章,未经博主允许可以转载。(转呀转呀/笑哭),希望标注出处hhh https://blog.csdn.net/qq_36428171/article/details/88555302

二叉树

每个结点最多有两个子树的树,左右子树是有顺序的。
就算某个结点仅有一棵子树,也需要分左右子树。
二叉树的第i层最多有2^(i-1)个结点

特殊的二叉树:

  • 斜树
  • 满二叉树
  • 完全二叉树

二叉树的存储结构

二叉树的顺序存储结构:对斜树存储很不友好
二叉树的链式存储结构:使用二叉链表,用两个指针分别指向左右子树。

typedef struct BiTNode
{
	int data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

二叉树的遍历
按照某种次序依次访问二叉树中所有的结点,使每一个结点都被访问一次

  1. 前序遍历:二叉树如果为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。左右
  2. 中序遍历:二叉树如果为空,则空操作返回,否则从根结点开始,然后中序遍历左子树,然后访问根结点,再中序遍历右子树 ,左
  3. 后续遍历:二叉树如果为空,则空操作返回,否则从左到右先叶子后结点方式遍历左右子树,然后访问根结点,左右
  4. 层序遍历:一层层从做到右遍历

以前序遍历输出层数。

#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;

typedef struct BiTNode
{
    ElemType data;
    struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

void CreateBiTree(BiTree *T){
    char c;

    scanf("%c", &c);
    if('x' == c){
        *T = NULL;
    }
    else
    {
        *T = (BiTNode *)malloc(sizeof(BiTNode));
        (*T)->data = c;
        CreateBiTree(&(*T)->lchild);
        CreateBiTree(&(*T)->rchild);
    }
}

void visit(char c,int level){
    printf("%c 位于第 %d 层\n", c, level);
}

void PreOrderTraverse(BiTree T, int level){
    if(T){
        visit(T->data,level);
        PreOrderTraverse(T->lchild, level + 1);
        PreOrderTraverse(T->rchild, level + 1);
    }
}

int main(){
    int level = 1;
    BiTree T = NULL;
    CreateBiTree(&T);
    PreOrderTraverse(T, level);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36428171/article/details/88555302