二叉树创建以及遍历方式
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.层次遍历: 有利用队列辅助操作遍历和线索二叉树等方法
下面是创建二叉树和遍历二叉树的代码演示:
性质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; }
相关文章推荐
- 蛇形填数
- 奇异值分解(SVD)原理详解及推导 (转)
- 读薄经典——《程序员修炼之道》
- Android中Scrollview、ViewPager、ListView冲突问题 (亲测可用)
- 2016年4月6日作业
- 团队冲刺第一天
- bzoj 3738: [Ontak2013]Kapitał 数论
- uva156
- 第一阶段冲刺总结04
- Visual Studio Visual C++
- linux命令大全
- hdu 1269 迷宫城堡 Tarjan算法
- 例题(8.9) 打印水仙花数 (1041)
- 使用JsonConfig中的setExcludes方法过滤不需要转换的属性
- 【LeetCode】LeetCode——第11题:Container With Most Water
- sqlite、mysql和postgresql对比
- CSS display 属性
- linux
- Android ecludeFromRecents
- 客户端测试