二叉树(二叉树的性质及遍历)

一、二叉树的性质

  1. 在二叉树的第i层上至多有2i-1个节点。

  2. 深度为k的二叉树至多有2k-1个节点。

  3. 对任意一棵二叉树T,若终端节点数为n0,而其度数为2的节点为n2,则n0=n2+1。

  4. 具有n个节点的完全二叉树的深度为

二、单链表结点的存储结构描述

typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node,*LinkList;

LinkListNode *同为结构指针类型,这两种类型是等价的。通常习惯上用LinkList说明指针变量,强调它是某个单链表的头指针变量。例如,使用定义LinkList L,L为单链表的头指针,从而提高程序的可读性。用Node*来定义指向单链表中结点的指针,例如,Node *p,p为指向单链表中结点的指针变量。

三、二叉树的遍历方式

  1. 先序遍历:根、左、右
  2. 中序遍历:左、根、右

  3. 后序遍历:左、右、根

#include <iostream>
#include <malloc.h>
using namespace std;

//二叉树的节点
typedef struct BiTNode
{
    char ch;;
    struct BiTNode *lchild;//左孩子
    struct BiTNode *rchild;//右孩子
}BiTNode,*BiTree;

//创建二叉树,性质:左侧<=右侧
void AddBiTree(BiTree T,BiTNode *p)
{
    if((p->ch <= T->ch) && (T->lchild != nullptr))
    {//数据小于等于根节点,并且根节点的左子树不为空
        AddBiTree(T->lchild,p);
    }else if((p->ch <= T->ch) && (T->lchild == nullptr))
    {//数据小于等于根节点,根节点的左子树为空
        T->lchild = p;
    }else if(T->rchild != nullptr)
    {//数据大于根节点,根节点的右子树不为空
        AddBiTree(T->rchild,p);
    }else T->rchild = p;
}

//对二叉树进行前序遍历:根、左、右
void PreOrder(BiTree T)
{
    if(T != nullptr)
    {
        cout<<T->ch;//先输入根节点
        PreOrder(T->lchild);//输出左子树
        PreOrder(T->rchild);//输出右子树
    }
}

//对二叉树进行中序遍历:左、根、右
void InOrder(BiTree T)
{
    if(T != nullptr)
    {
        InOrder(T->lchild);//输出左子树
        cout<<T->ch;//输入根节点
        InOrder(T->rchild);//输出右子树
    }
}

//对二叉树进行后序遍历:左、右、根
void PostOrder(BiTree T)
{
    if(T != nullptr)
    {
        PostOrder(T->lchild);//输出左子树
        PostOrder(T->rchild);//输出右子树
        cout<<T->ch;//输入根节点
    }
}

int main()
{
    char ch;//储存节点数据
    BiTree T = nullptr;//树T
    cin>>ch;//输入数据,以'0'为结束
    while(ch != '0')
    {
        //创建新的节点
        BiTNode *p = (BiTNode *)malloc(sizeof(BiTNode));//临时节点
        if(p)
        {
            p->ch = ch;
            p->lchild = nullptr;
            p->rchild = nullptr;
        }else
        {
            cout<<"内存分配出错"<<endl;
            return 0;
        }
        if(T==nullptr)
        {
            T = p;
        }else
        {
            AddBiTree(T,p);
        }
        cin>>ch;
    }
    //输出
    cout<<"二叉树先序遍历:";
    PreOrder(T);
    cout<<endl;
    cout<<"二叉树中序遍历:";
    InOrder(T);
    cout<<endl;
    cout<<"二叉树后序遍历:";
    PostOrder(T);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/xcxfury001blogs/p/11424884.html