您的位置:首页 > 其它

二叉树创建以及遍历方式

2016-04-22 20:02 471 查看
二叉树的几个重要性质:
性质1 : 在二叉树的第i层最多有2^i - 1个结点
性质2 : 深度为k的二叉树最多含有2^k - 1个结点
[b]
性质3 : 对于任何二叉树,如果叶子结点个数为N0,度数为2的结点个数为N2,则由下列等式:
[/b]
N0 = N2+1
[b]
性质4 : 具有n个结点的完全二叉树的深度为log2(n) + 1


[/b]
[b][b]
性质5 : 如果有n个结点的完全二叉树按层进行结点编号,有下列结论:


[/b][/b]
[b][b]
1.如果i = 1,表示根节点,无双亲结点
[/b][/b]
[b][b][b][b][b]
2.如果i > 1, 则双亲结点的编号为[ i / 2 ]
[/b][/b]

[/b][/b][/b]
[b][b][b][b][b][b][b][b]
3.如果2i > n ,则结点i没有左孩子否则左孩子的结点为2i
[/b][/b]

[/b][/b][/b][/b][/b][/b]
[b][b][b][b][b][b][b][b][b][b][b]
4.如果2i+1 > n,则结点没有右孩子,否则右孩子结点为2i + 1
[/b][/b]

[/b][/b][/b][/b][/b][/b][/b][/b][/b]
二叉树的遍历:
1.先序遍历: 先访问根节点,在访问左子树,最后访问右子树
2.中序遍历: 先访问左子树,在访问根节点,最后访问右子树
3.后序遍历: 先访问左子树,在访问右子树,最后访问根节点
快速记忆:先,中,后是根据访问根节点的次序结点的,并且左子树必须在右子树之前访问

4.层次遍历: 有利用队列辅助操作遍历和线索二叉树等方法

下面是创建二叉树和遍历二叉树的代码演示:

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <queue>
using namespace std;
#define ERROR -1
#define OVER_FLOW 0
#define OK 1
#define INPUT_MAX_LEN 100
char inputstr[100] = {0};
typedef int Status;
typedef char ElemType;
typedef struct treenode{
ElemType data;			//结点数据单元
struct treenode * right_child;  //二叉树的左孩子指针域
struct treenode * left_child;  //二叉树的右孩子指针域
}BiTNode,*BiTree;
/*要求输入格式为:AB##CD###的形式,其中#表示该结点处没有孩子结点,输入为二叉树前序遍历的顺序*/
void visit(const BiTNode *bn){
printf("%c  ",bn->data);
}
char ScanInputStr(){
static int index = 0;
return inputstr[index++];
}
Status CreateBiTree(BiTree &bitree){  //根据特定输入格式创建一颗二叉树
char tempChar = ScanInputStr();
if(tempChar != '#'){
bitree = (BiTree)malloc(sizeof(BiTNode));
if(bitree == NULL)
return OVER_FLOW;
bitree->data = tempChar;
CreateBiTree(bitree->right_child);  //递归创建左子树
CreateBiTree(bitree->left_child);  	//递归创建右子树
}else
bitree = NULL;
return OK;
}
void  PreOrderTraverse(const BiTree bitree){ //先序遍历二叉树,递归思想
if(bitree != NULL){
visit(bitree);
PreOrderTraverse(bitree->right_child);
PreOrderTraverse(bitree->left_child);
}
}
void InOrderTraverse(const BiTree bitree){ //中序遍历二叉树
if(bitree){
InOrderTraverse(bitree->right_child);
visit(bitree);
InOrderTraverse(bitree->left_child);
}
}
void PostOrderTraverse(const BiTree bitree){ //后序遍历
if(bitree){
PostOrderTraverse(bitree->right_child);
PostOrderTraverse(bitree->left_child);
visit(bitree);
}
}
void LevelOrderTraverse(const BiTree bitree){  //层次遍历
if(bitree){
queue<BiTNode*> mqueue;  //辅助队列
mqueue.push(bitree);
BiTNode * pointer;
while(!mqueue.empty()){
pointer = mqueue.front();
mqueue.pop();
visit(pointer);
if(pointer->right_child)
mqueue.push(pointer->right_child);
if(pointer->left_child)
mqueue.push(pointer->left_child);
}
}
}
int main(){
cout<<"Please input the string of the bitree"<<endl;
//cin>>inputstr;
strcpy(inputstr,"ABC##DE#G##F###");
BiTree mtree = NULL;
CreateBiTree(mtree);
cout<<"The Result of  PreOrderTraverse: ";
PreOrderTraverse(mtree);
cout<<endl;
cout<<"The  Result of  InOrderTraverse: ";
InOrderTraverse(mtree);
cout<<endl;
cout<<"The Result of PostOrderTraverse: ";
PostOrderTraverse(mtree);
cout<<endl;
cout<<"The Result of LevelOrderTraverse:";
LevelOrderTraverse(mtree);
cout<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: