二叉树
来源:互联网 发布:如何恢复航天开票数据 编辑:程序博客网 时间: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");}
源码下载点击打开链接
- 二叉树、二叉堆
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 查找最小的k个元素
- 网页BOA控制ARM板的LED各文件分析
- 数据结构:栈的应用之中缀转后缀C++
- Design Pattern :Prototype
- 要工作去咯,博客暂停更新公告
- 二叉树
- 11g中使用FDA
- 菜鸟才写这个
- oracle sql 效率优化
- 连接时出错,(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0' .
- 输出中文备忘
- UVA 10285 Longest Run on a Snowboard
- Android Button的点击事件【原创】
- android图片旋转处理