一、二叉树的性质
-
在二叉树的第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; }