二叉树

来源:互联网 发布:如何恢复航天开票数据 编辑:程序博客网 时间:2024/06/08 11:41

递归定义:树(Tree)是n(n>=0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件:

 1)有且仅有一个特定的称为根(Root)的结点;

 2)其余的结点可分为m(m>=0)个互不相交的子集T1,T2,T3…Tm,其中每个子集又是一棵树,并称其为子树(Subtree)。

树的基本术语:

根           —树中唯一没有前驱的结点。
度          —一个结点的子树的数目,称为结点的度。树中结点的度的最大值,称为树的度。
叶           —度为0的结点,也称为终端结点。
分枝结点—度大于0的结点称为分支结点或非终端结点(分为单分支结点、双分支结点等等)。
二叉树  —每个结点至多只有两棵子树


性质1:         在二叉树的第i层上至多有2i-1个结点(i>=1)

性质2:         深度为k的二叉树至多有2k-1个结点(k>=1)
性质3:         对任何一棵二叉树,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1
性质4:         具有n个结点的完全二叉树的深度为ëlog2nû+1
满二叉树:    一棵深度为k且有2^k-1个结点的二叉树
完全二叉树:如果深度为k、由n个结点的二叉树中个结点能够与深度为k的顺序编号的满二叉树从1到n标号的结点相对应

先序遍历:先遍历根节点,再遍历左子树,最后遍历右子树
中序遍历:先遍历左子树,再遍历根节点,最后遍历右子树
后序遍历:先遍历左子树,再遍历右子树,最后遍历根节点

//binaryTree.h#ifndef _BINARY_TREE_H_#define _BINARY_TREE_H_#include<stdio.h>#include<stdlib.h>#include<memory.h>#define MAX_SIZE 100typedef struct BiTNode{  char data;  struct BiTNode *lChild;  struct BiTNode *rChild;}Node,*pBiTNode,*BiTree;typedef struct stack{pBiTNode stack_Arr[MAX_SIZE];int top;}STACK;int preOrderCreateBitTree(pBiTNode *pRoot); pBiTNode inOrderCreateBitTree(pBiTNode *pRoot); int postOrderCreateBitTree(pBiTNode *pRoot);pBiTNode preOrderTraverse(pBiTNode root);pBiTNode inOrderTraverse(pBiTNode root);pBiTNode postOrderTraverse(pBiTNode root);pBiTNode Traverse(pBiTNode root);void initStack(STACK *p);int push(STACK *p,pBiTNode node);int pop(STACK *p);pBiTNode stackTop(STACK *);int isEmpty(STACK *);int isFull(STACK *);#endif


#include"binaryTree.h"void initStack(STACK *p){p->top=-1;}int isEmpty(STACK *p){  if(p->top==-1)  return 1;  else  return 0;}int isFull(STACK *p){if(p->top == MAX_SIZE-1)return 1;elsereturn 0;}int push(STACK *p,pBiTNode node){  if(isFull(p)==1)  return -1;  p->top++;  p->stack_Arr[p->top]=node;  return 0;}int pop(STACK *p){  if(isEmpty(p)==1)  return -1;  p->stack_Arr[p->top]=NULL;  p->top--;  return 0;}pBiTNode stackTop(STACK *p){  if(isEmpty(p)==1)  return NULL;  return p->stack_Arr[p->top];}

//binaryTree.c#include "binaryTree.h"int preOrderCreateBitTree(pBiTNode *pRoot){char c;printf("if you want stop create node input 'q':\n");fflush(stdin);c=getchar();if(c=='q')return 0;//1.先序创建根节点并赋值*pRoot=(pBiTNode)malloc(sizeof(Node));if(NULL == pRoot){printf("root node malloc failed!\n");exit(-1);}memset(*pRoot,0,sizeof(Node));(*pRoot)->data=c;//2.先序创建左子树preOrderCreateBitTree(&(*pRoot)->lChild);//3.先序创建右子树    preOrderCreateBitTree(&(*pRoot)->rChild);return 0;}pBiTNode preOrderTraverse(pBiTNode root){if(root==NULL){printf("This is A NULL Tree!\n");return NULL;}printf("%c\n",root->data);  preOrderTraverse(root->lChild);preOrderTraverse(root->rChild);return root;}pBiTNode inOrderTraverse(pBiTNode root){if(root){inOrderTraverse(root->lChild);printf("%c\n",root->data);    inOrderTraverse(root->rChild);}else{        printf("This is A NULL Tree!\n");}return root;}pBiTNode postOrderTraverse(pBiTNode root){if(root){postOrderTraverse(root->lChild);postOrderTraverse(root->rChild);printf("%c\n",root->data);    }else{        printf("This is A NULL Tree!\n");}return root;}pBiTNode Traverse(pBiTNode root){pBiTNode  pTemp=NULL;STACK *sta=(STACK *)malloc(sizeof(STACK));if(sta==NULL||root==NULL)return NULL;initStack(sta);push(sta,root);while(!isEmpty(sta))//栈不为空{      pTemp=stackTop(sta);  pop(sta);  printf("%-3c",pTemp->data);      if(pTemp->rChild!=NULL)  {  push(sta,pTemp->rChild);  }  if(pTemp->lChild!=NULL)  {         push(sta,pTemp->lChild);  }}return root;}

//main.c#include "binaryTree.h"void main(){pBiTNode root=NULL;int res=preOrderCreateBitTree(&root);    if(res){printf("create tree failed!\n");exit(-1);}Traverse(root);//postOrderCreateBitTree(&root);//preOrderTraverse(root);//inOrderTraver(root);//postOrderTraver(root);system("pause");}


源码下载点击打开链接

原创粉丝点击