首页 > 代码库 > 二叉树
二叉树
二叉树相关概念:
- 路径:对于节点n1 n2 n3….nk从n1到nk的路径长度为k-1
- 节点的层数:只有一个根节点,则层数为1,其余节点的层数为双亲节点的层数加1
- 树的深度:树中所有节点的最大层数称为树的深度,只有根节点深度为1。
- 满二叉树:所有分支节点存在左子树和右子树,并且所有的叶子节点都在同一层上。
- 完全二叉树:对于树中的节点从上至下、从左到右顺序进行编号,且与满二叉树的位置编号相同。完全二叉树特点:叶子节点只能出现在最下层和次下层,且最下层的叶子节点集中在树的左边,满二叉树肯定是完全二叉树,反之不一定。如果完全二叉树中子节点个数分别为0、1、2的节点数分别用n0 n1 n2表示,节点总数n=n0+n1=n2,且n1只能为0或者1。
二叉树相关性质:
- 一颗深度为k的二叉树中,最多有2的k次方-1个节点(满二叉树),最少有k个节点
- 对于一颗非空二叉树,度为0的节点总是比度为2的几点多一个,即:n0=n2+1;
- 具有n个节点的完全二叉树的深度为【logn】+1,【】为向下取整;
- 对于n个节点从1开始编号的完全二叉树,对于节点编号i的节点:
(1)如果2i<=n,则序号为i的节点的左孩子节点的序号为2i;如果2i>n,则序号为i的节点无左孩子;
(2)如果2i+1<=n,则i节点有孩子序号为2i+1,如果2i+1>n,则i无右孩子。
二叉树的遍历:
1、先序遍历:先序遍历是先输出根节点,再输出左子树,最后输出右子树。上图的先序遍历结果就是:ABCDEF
2、中序遍历:中序遍历是先输出左子树,再输出根节点,最后输出右子树。上图的中序遍历结果就是:CBDAEF
3、后序遍历:后序遍历是先输出左子树,再输出右子树,最后输出根节点。上图的后序遍历结果就是:CDBFEA
#include <stdio.h> #include <stdlib.h> typedef char TelemType; typedef struct TNode{ TelemType data; struct TNode *lchild,*rchild; } BitNode; //声明BitNode* createTree(void); void preOrderTraverse(BitNode *); void inOrderTraverse(BitNode *);void lastOrderTraverse(BitNode *);int main(int agrc,char *argv[]){ BitNode *root=NULL; root=createTree(); printf("\n先序遍历二叉树:"); preOrderTraverse(root); printf("\n中序遍历二叉树:"); inOrderTraverse(root); printf("\n后序遍历二叉树:"); lastOrderTraverse(root); return 0; }//创建二叉树 BitNode* createTree(void){ BitNode *b; TelemType ch; scanf("%c",&ch); if(ch==‘#‘) { b=NULL; } else { b=(BitNode *)malloc(sizeof(BitNode)); b->data=http://www.mamicode.com/ch; b->lchild=createTree(); b->rchild=createTree(); } return b;} //先序遍历 void preOrderTraverse(BitNode *root){ if(root) { printf("%c",root->data); preOrderTraverse(root->lchild); preOrderTraverse(root->rchild); } }//中序遍历 void inOrderTraverse(BitNode *root){ if(root) { inOrderTraverse(root->lchild); printf("%c",root->data); inOrderTraverse(root->rchild); } } //后序遍历 void lastOrderTraverse(BitNode *root){ if(root) { lastOrderTraverse(root->lchild); lastOrderTraverse(root->rchild); printf("%c",root->data); } }
输出结果如下图:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。