- 二叉树
度为2的树
特点:
①每个结点最多有两棵子树,所以二叉树不存在度大于2的结点;
②二叉树是有序的,其次序不能任意颠倒,即使树中的某个结点只有一棵子树,也要区分它是左子树还是右子树。
性质
① 二叉树的第i层上最多有2的i-1次方个结点
②在一棵深度为k的二叉树中,最多有2的k次方-1个结点,最少有k个结点。
③在一棵二叉树中,如果叶子结点的个数为n0,度为2的结点个数n2,则n0=n2+1
④具有n个结点的完全二叉树的深度为向下取整log2 n +1
⑤对一棵具有n个结点的完全二叉树中的结点从1开始按层序编号,则对于任意的编号为i(1<=i<=n)的结点,有
(1)如果i>1 则结点i的双亲的编号为i/2向下取整;否则结点i是根节点,无双亲。
(2)如果2i<=n,则结点i的左孩子的编号为2i,否则结点i无左孩子。
(3)如果2i+1<=n,则结点i的右孩子的编号为2i+1,否则结点i无右孩子。
c++实现二叉链表创建 遍历
#include<iostream>
using namespace std;
/*
二叉树的创建 释放 遍历
存储方式: 二叉链表 BiNode
*/
struct BiNode{
char data;
BiNode * lchild;
BiNode * rchild;
};
class BiTree{
public:
BiTree(){root = Creat(root);}
~BiTree(){
Release(root);
}
void PreOrder(){
PreOrder(root);
}
void InOrder(){
InOrder(root);
}
void PostOrder(){
PostOrder(root);
}
private:
BiNode * root;
BiNode * Creat(BiNode * bt);
void Release(BiNode * bt);
void PreOrder(BiNode * bt);
void InOrder(BiNode * bt);
void PostOrder(BiNode * bt);
};
//前序遍历
void BiTree::PreOrder(BiNode * bt){
if(bt==NULL)
return;
else{
cout<<bt->data;
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
//中序遍历
void BiTree::InOrder(BiNode * bt){
if(bt == NULL)
return;
else{
InOrder(bt->lchild);
cout<<bt->data;
InOrder(bt->rchild);
}
}
//后序遍历
void BiTree::PostOrder(BiNode * bt){
if(bt == NULL)
return;
else{
PostOrder(bt->lchild);
PostOrder(bt->rchild);
cout<<bt->data;
}
}
BiNode * BiTree::Creat(BiNode * bt){
char ch;
cin>>ch;
if(ch == '#')
bt = NULL;
else{
bt = new BiNode;
bt->data = ch;
bt->lchild = Creat(bt->lchild);
bt->rchild = Creat(bt->rchild);
}
return bt;
}
void BiTree::Release(BiNode * bt){
if(bt != NULL){
Release(bt->lchild);
Release(bt->rchild);
delete bt;
}
}
int main(){
BiTree biTree;
biTree.PreOrder();
cout<<endl;
biTree.InOrder();
cout<<endl;
biTree.PostOrder();
return 0;
}