二叉树创建以及遍历方式

来源:互联网 发布:淘宝网折叠床单人价格 编辑:程序博客网 时间:2024/06/05 08:40
二叉树的几个重要性质:
    性质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 100char 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; }


1 0
原创粉丝点击