二叉树创建以及遍历方式

二叉树的几个重要性质:
    性质1 : 在二叉树的第i层最多有2^i - 1个结点
    性质2  :  深度为k的二叉树最多含有2^k - 1个结点
    性质3  :  对于任何二叉树,如果叶子结点个数为N0,度数为2的结点个数为N2,则由下列等式:
                  N0 = N2+1
    性质4  :  具有n个结点的完全二叉树的深度为log2(n) + 1
    性质5  :  如果有n个结点的完全二叉树按层进行结点编号,有下列结论:
                 1.如果i = 1,表示根节点,无双亲结点
                 2.如果i > 1, 则双亲结点的编号为[ i / 2 ]
                 3.如果2i > n ,则结点i没有左孩子否则左孩子的结点为2i
                 4.如果2i+1 > n,则结点没有右孩子,否则右孩子结点为2i + 1
二叉树的遍历:
    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;
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值