一、二叉树的性质
-
在二叉树的第i层上至多有2i-1个节点。
-
深度为k的二叉树至多有2k-1个节点。
-
对任意一棵二叉树T,若终端节点数为n0,而其度数为2的节点为n2,则n0=n2+1。
-
具有n个节点的完全二叉树的深度为
。
二、单链表结点的存储结构描述
typedef struct Node
{
ElemType data;
struct Node *next;
}Node,*LinkList;
LinkList和Node *同为结构指针类型,这两种类型是等价的。通常习惯上用LinkList说明指针变量,强调它是某个单链表的头指针变量。例如,使用定义LinkList L,则L为单链表的头指针,从而提高程序的可读性。用Node*来定义指向单链表中结点的指针,例如,Node *p,则p为指向单链表中结点的指针变量。
三、二叉树的遍历方式
- 先序遍历:根、左、右
-
中序遍历:左、根、右
-
后序遍历:左、右、根
#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;
}
