求一棵二叉树的深度和双分支结点的个数

求一棵二叉树的深度和双分支结点的个数
求一棵二叉树的深度和双分支结点的个数

二叉树采用二叉链表结构表示。设计并实现如下算法:求一棵二叉树的深度和双分支结点的个数。

#include

#include

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

typedef struct BiTNode

{ /*数结构*/

char data;

struct BiTNode *lchild,*rchild;

} BiTNode,*BiTree;

BiTree CreateBiTree()

{ /*递归建树*/

char ch;

BiTree T;

scanf("%c",&ch);

if(ch==' ')

T=NULL;

else

{

T=(BiTNode *)malloc(sizeof(BiTNode));/*分配存储空间*/

T->data=ch;/*生存根节点*/

T->lchild=CreateBiTree();/*构造右子树*/

T->rchild=CreateBiTree();/*构造左子树*/

}

return (T);

}

int DeepTree(BiTree T)

{ /*求深度*/

int N1,N2;

if(T==NULL)

return 0;

else

N1=DeepTree(T->rchild);/*遍历左子树*/

N2=DeepTree(T->lchild);/*遍历右子树*/

if(N1>N2)

return N1+1;

else

return N2+1;

}

int NumNode(BiTree T)

{

/*求双节点个数*/

int num1,num2;

if(T==NULL)

return 0;

num1=NumNode(T->rchild);/*遍历左子树*/ num2=NumNode(T->lchild);/*遍历右子树*/ if(T->rchild!=NULL&T->lchild!=NULL) return (num1+num2+1);

else

return (num1+num2);

}

void main()

{

BiTree T;

int i,k;

printf("please create tree:\n");

T=CreateBiTree();

printf("\n");

i=DeepTree(T);

printf("the tree's deep is \n%d",i);

printf("\n");

k=NumNode(T);

printf("the two node is \n%d",k);

getch();

}

数据结构求二叉树深度和度为2的节点个数代码实现

/* 求二叉树的深度 求二叉树度为2的节点个数 附带详细注释 */ # include # include //二叉树的节点结构体 typedef struct Tnode { char data; struct Tnode * lchild; struct Tnode * rchild; }NODE, * PTNODE; typedef int Status; //定义一个全局变量,用于统计度为2的节点 int count = 0; # define OK 1 # define ERROR 0 //创建一个二叉树 Status CreatTree( PTNODE & ); //先序遍历二叉树 Status InOrderTraveler( PTNODE & ); //求出树的深度 Status DeepTree( PTNODE & ); //求出树中度为2的节点个数 Status TwoDegreeNode( PTNODE & ); /* 先序创建一颗二叉树 这段代码在前面已经写烂~~( ﹁﹁) ~~~ */ Status CreatTree( PTNODE & T ) { char data; scanf( "%c", &data ); if( ' ' == data ) {

T = NULL; //如果是#,说明是一颗空树 } else { //节点有值,则创建这个节点 T = ( PTNODE )malloc( sizeof( NODE ) ); if( NULL == T ) { printf( "节点动态空间分配失败\n" ); return ERROR; } T -> data = data; CreatTree( T -> lchild ); CreatTree( T -> rchild ); } return OK; } /* 先序遍历二叉树 同样的,这一段代码也同样是写烂了 写这段代码的作用是为了检查刚刚那个二叉树生成了没*/ Status InOrderTraveler( PTNODE &T ) { if( NULL != T ) { printf( "%c", T -> data ); InOrderTraveler( T -> lchild ); InOrderTraveler( T -> rchild ); } return OK; } /* 求出二叉树的深度,这个才是今天的猪脚 */ int DeepTree( PTNODE & T ) { //设置两个整型变量,用于接收左子树和右子树的深度int LDeep, RDeep; if( NULL == T )

求二叉树的深度叶子结点数总结点数()

#include"malloc.h" #define NULL 0 #include"stdio.h" typedef struct node { char data; struct node *lchild,*rchild; }NODE; int count; NODE *crt_bt_pre()/*二叉树先序创建算法*/ { NODE * bt; char ch; printf("\n\t\t\t"); scanf("%c",&ch); getchar(); if(ch==' ') bt=NULL; else { bt=(NODE*)malloc(sizeof(NODE)); bt->data=ch; printf("\n\t\t\t请输入%c结点的左孩子:",bt->data); bt->lchild=crt_bt_pre(); printf("\n\t\t\t请输入%c结点的右孩子:",bt->data); bt->rchild=crt_bt_pre(); } return(bt); } void Preorder(NODE* bt)/*二叉树先序递归遍历算法*/ { if(bt!=NULL) { printf("\n\t\t\t %c",bt->data); Preorder(bt->lchild); Preorder(bt->rchild); } } void Inorder(NODE* bt) {

if(bt!=NULL) { Inorder(bt->lchild); printf("\n\t\t\t %c",bt->data); Inorder(bt->rchild); } } void Postorder(NODE* bt) { if(bt!=NULL) { Postorder(bt->lchild); Postorder(bt->rchild); printf("\n\t\t\t %c",bt->data); } } int CountLeaf(NODE *bt)/*求二叉树叶子结点数的递归遍历算法*/ { if(bt==NULL) return 0; if(bt->lchild==NULL&&bt->rchild==NULL) count++; CountLeaf(bt->lchild); CountLeaf(bt->rchild); return(count); } int CountNode (NODE* bt)/*求二叉树结点数的递归遍历算法*/ { if(bt==NULL) return 0; else count++; CountNode(bt->lchild); CountNode(bt->rchild); return(count); } int TreeDepth(NODE* bt)/*求二叉树深度的递归遍历算法*/ { int x,y; if(bt==NULL)

求树和二叉树的深度题目及源程序代码

树和二叉树 以下问题要求统一在一个大程序里解决。 10、按先序遍历的扩展序列建立二叉树的存储结构 11、二叉树先序、中序、后序遍历的递归算法 12、二叉树中序遍历的非递归算法 13、二叉树层次遍历的非递归算法 14、求二叉树的深度(后序遍历) 15、建立树的存储结构 16、求树的深度 17、 源程序代码: // tree.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "stdio.h" #include "stdlib.h" #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -1 typedef char TElemType; // 元素数据类型 typedef int Status; /* 二叉链表储存结构*/ typedef struct BiTNode { TElemType data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree; bool CreateBiTree(BiTree &T) { //先序序列建立二叉树 char ch; scanf("%c",&ch); if (ch=='*') T = NULL;

else { if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR; T->data = ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } return OK; } Status PrintElement(TElemType e) { // 访问函数 printf("%c", e); return OK; } Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType)) { //先序遍历二叉树的递归算法 if (T) { if (Visit(T->data)) if (PreOrderTraverse(T->lchild, Visit)) if (PreOrderTraverse(T->rchild, Visit)) return OK; return ERROR; }else return OK; } Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType)) { //中序遍历二叉树的递归算法 if (T) { if (InOrderTraverse(T->lchild, Visit)) if (Visit(T->data)) if (InOrderTraverse(T->rchild, Visit)) return OK; return ERROR; }else return OK;

二叉树叶子结点个数计算

计算二叉树叶子结点 1.程序设计简介 已知一棵二叉树,求该二叉树中叶子结点的个数。 2.基本要求 (1)设计二叉树的二叉链表为存储结构 (2)设计求叶子结点个数的递归算法 (3)输入:一颗二叉树 (4)输出:二叉树中叶子结点的个数 3.实现提示 (1)存储设计 二叉树采用二叉链表为存储结构 (2)算法设计 求二叉树中叶子结点个数,即求二叉树的所有结点中左、右子树均为空的结点个数之和。可以将此问题转化为遍历问题,在遍历中“访问一个结点”时判断该结点是不是叶子,若是则将计数器累加。 4.源程序 #include #include using namespace std;

struct BiNode 行与测试 6.调试感想 非递归算法求叶子结点的个数 #include #include using namespace std; struct node { int data; node *lchild; node *rchild; }; node *root=NULL; void mid(node*root,int key=500) { int sum=0; stacks; while(NULL!=root || !()) { if(NULL!=root) {

(root); root=root->lchild; } else { root=(); // cout<data<<" "; if(NULL==root->lchild && NULL==root->rchild) ++sum; (); root=root->rchild; } } cout<data=100; node *a=new node; node *b=new node; node *a1=new node; node *a2=new node; node *b1=new node; node *b2=new node; a->data=200; b->data=300; a1->data=400; a2->data=500; b1->data=600; b2->data=700; root->lchild=a; root->rchild=b; a->lchild=a1; a->rchild=a2;

二叉树的基本参数计算

/*二叉树的基本参数计算*/ #include #include #define MaxSize 20 typedef int ElemType; #define OK 1 typedef struct BiTNode { ElemType data; struct BiTNode *lchild, *rchild; }BiTNode,*BiTree; //建立二叉树(按先序序列生成二叉树,#表示空节点) void CreateBiTree(BiTree *T) { char ch; scanf("%c",&ch); getchar();/*回车键(每次输入一个字符后,需敲回车键)*/ if(ch=='#') { printf("不产生子树。\n"); *T=NULL; } else { if(!(*T=(BiTNode *)malloc(sizeof(BiTNode)))) { printf("分配空间失败"); return; }//生成一个新节点 (*T)->data = ch; printf("产生左右子树。\n"); CreateBiTree(&(*T)->lchild); CreateBiTree(&(*T)->rchild); } } //交换左右子树产生新的树t返回到主函数 BiTNode *swap(BiTree T) { BiTree t,t1,t2; if(T==NULL) t=NULL; else {

t=(BiTNode*)malloc(sizeof(BiTNode)); t->data=T->data; t1=swap(T->lchild); //交换左右子树 t2=swap(T->rchild); t->lchild=t2; t->rchild=t1; } return(t); } //求树的叶子结点数 int leafs(BiTree T) { int num1,num2; if(T==NULL) return 0; else if(T->lchild==NULL&&T->rchild==NULL) return 1; else { num1=leafs(T->lchild); num2=leafs(T->rchild); return (num1+num2); } } //求二叉树的深度 int Depth(BiTNode *T) { int dep1,dep2; if(T==NULL) return(0); else { dep1=Depth(T->lchild); dep2=Depth(T->rchild); if(dep1>dep2) return(dep1+1); else return(dep2+1); } } //按广义表形式输出二叉树 void Disptree(BiTNode *T)

实验报告二叉树求叶子结点数目(内容清晰)

实验叶子结点的计算 姓名:xxx 班级:xxx) 学号:16130xxxxx 时间2017.10.22 1 问题描述 二叉树叶子节点的计算 1.二叉树的创建 2.二叉树的图形显示 3.二叉树叶子节点的计算 2 结构设计 二叉树叶子结点的计算主要是二叉树的创建,在这里选择的存储结构是一个链式存Data lchild rchild struct BTNode{ int data; BTNode*lchild; BTNode*rchild; }; 3 算法设计 在程序正式编写之前我定义了几个功能函数 (1)指针清空函数,预定义一个指针bt 使lchild和rchild的值分别赋予bt并且使其为空 static int clear(BTNode *bt) { if (bt) { clear(bt->lchild ); clear(bt->rchild ); cout<<"释放了指针"<

{ if(p->lchild==NULL&&p->rchild==NULL)count++; Leaf(p->lchild,count); Leaf(p->rchild,count); } return count; } (2)二叉树的创建 同样是利用递归的方式,输入参数包括指针,左右判断,以及判空条件static int create(BTNode *p,int k ,int end) { BTNode *q; int x; cin>>x; if(x!=end) { q=new BTNode; q->data =x; q->lchild=NULL; q->rchild=NULL; if(k==1)p->lchild=q; if(k==2)p->rchild=q; create(q,1,end); create(q,2,end); } return 0; }; (3)类的构造函数创建树并且输入各结点数值 在这里,采用的时先序遍历法依次输入树中的各结点数值 Step 1:定义新的结构体指针, Step 2:申请动态存储空间; Step 3:输入节点元素,并且指针后移到输入结点的后继结点,end作为结点结束标志; Step 4:重复步骤3,直到输入结束; void BinaryTree::CreateBiTree (int end) { cout<<"请按照先序序列的顺序输入二叉树,-1为空指针域标志:"<>x; if(x==end)return; p=new BTNode;

二叉树习题及答案

1.设一棵完全二叉树共有699 个结点,则在该二叉树中的叶子结点数? 1根据二叉树的第i层至多有2A(i - 1)个结点;深度为k的二叉树至多有2A k - 1 个结点(根结点的深度为1)”这个性质: 因为2A9-1 < 699 < 2A10-1 , 所以这个完全二叉树的深度是10,前9 层是一个满二叉树, 这样的话,前九层的结点就有2A9-1=511 个;而第九层的结点数是2A(9-1)=256 所以第十层的叶子结点数是699-511=188 个;现在来算第九层的叶子结点个数。由于第十层的叶子结点是从第九层延伸的,所以应该去掉第九层中还有子树的结点。因为第十层有188 个,所以应该去掉第九层中的188/2=94 个;所以,第九层的叶子结点个数是256-94=162,加上第十层有188 个,最后结果是350 个 2完全二叉树:若二叉树中最多只有最下面两层的结点的度可以小于2,并且最下面一层的结点 (叶结点) 都依次排列在该层最左边的位置上,这样的二叉树为完全二叉树。 比如图:完全二叉树除叶结点层外的所有结点数(叶结点层以上所有结点数)为奇数,此题中,699 是奇数,叶结点层以上的所有结点数为保证是奇数,则叶结点数必是偶数,这样我们可以立即选出答案为B!如果完全二叉树的叶结点都排满了,则是满二叉树,易得满二叉树的叶结点数是其以上所有层结点数+1 比如图: 此题的其实是一棵满二叉树,我们根据以上性质,699+1=700,700/2=350,即叶结点数为350,叶结点层以上所有结点数为350-1=349。 3完全二叉树中,只存在度为2 的结点和度为0 的结点,而二叉树的性质中有一条是: nO=n2+1 ; nO指度为0的结点,即叶子结点,n2指度为2的结点,所以2n2+1=699 n2=349 ; n0=350 2.在一棵二叉树上第 5 层的结点数最多是多少一棵二叉树,如果每个结点都是是满的,那么会满足2A(k-1)1 。所以第5 层至多有2A(5-1)=16 个结点! 3.在深度为5 的满二叉树中,叶子结点的个数为答案是16 ~ 叶子结点就是没有后件的结点~ 说白了~ 就是二叉树的最后一层~ 深度为K 的二叉树~ 最多有2Ak-1 个结点~ 最多有2A(k-1) 个结点~ 所以此题~ 最多有2A5-1=31 个结点~ 最多有2A(5-1)=16 个叶子结点~ 4.某二叉树中度为2 的结点有18 个,则该二叉树中有几个叶子结点?结点的度是指树中每个结点具有的子树个数或者说是后继结点数。 题中的度为2 是说具有的2 个子树的结点;二叉树有个性质:二叉树上叶子结点数等于度为2 的结点数加1。 5.在深度为7 的满二叉树中,度为2 的结点个数为多少,就是第一层只有一个节点,他有两个子节点,第二层有两个节点,他们也都有两个子节点以此类推,所以到第6 层,就有2的5次方个节点,他们都有两个子节点最后第7 层都没有子节点了。因为是深度为7 的。 所以就是1+2+4+8+16+32 了 2深度为1的时候有0个 深度为2的时候有1个 深度为3的时候有3个 深度为4的时候有7个 深度为n的时候有(2的n-1次方减1 )个 6?—棵二叉树中共有70个叶子结点与80个度为1的结点,则该二叉树中的总结点数为?

设二叉树采用链式存储结构,试设计一个算法计算一棵给定二叉树中叶子结点的数目

#include #include #define max 10 typedef struct node{ char data; node *lchild,*rchild; }Bitree; Bitree *B[max]; Bitree *Creatree(){ //建立二叉树 Bitree *T,*S; char ch; int front,rear,sign; sign=0; front=0; rear=-1; T=NULL; printf("建立二叉树:\n"); ch=getchar(); while(ch!='#'){ if(ch!='@'){ //输入结点不就是虚结点 S=(Bitree *)malloc(sizeof(Bitree)); S->data=ch; S->lchild=S->rchild=NULL; rear++; B[rear]=S; if(rear==front){ T=S; sign++; } else{ if(sign%2==1) //寻找父结点 B[front]->lchild=S; if(sign%2==0){ B[front]->rchild=S; front++; } sign++; } } else{ //输入结点为虚结点 if(sign%2==0) front++; sign++; } ch=getchar(); } return T; } int Searchleaf(Bitree *T){ //计算叶子数if(T==NULL) return 0; else if(T->lchild==NULL&&T->rchild==NULL) return 1; else return(Searchleaf(T->lchild)+Searchleaf(T->rc hild)); } void visit(Bitree *T){ printf("%c\n",T->data); } void Inorder(Bitree *T){ //中序遍历二叉树 if(T!=NULL){ Inorder(T->lchild); visit(T); Inorder(T->rchild); } } void main(){ Bitree *T; T=Creatree(); printf("中序遍历:\n"); Inorder(T); printf("叶子数%d\n",Searchleaf(T)); }

求二叉树中节点的最大距离

求二叉树中节点的最大距离
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义“距 离”为两个节点之间边的个数。 写一个程序求一棵二叉树中相距最远的两个节点之间的距离。 如图 3-11 所示,粗箭头的边表示最长距离:
图 3-11
树中相距最远的两个节点 A,B

分析与解法
我们先画几个不同形状的二叉树,(如图 3-12 所示),看看能否得到一些启示。
图 3-12
几个例子?
从例子中可以看出,相距最远的两个节点,一定是两个叶子节点,或者是一个叶子节点 到它的根节点。(为什么?) 【解法一】 根据相距最远的两个节点一定是叶子节点这个规律,我们可以进一步讨论。 对于任意一个节点,以该节点为根,假设这个根有 K 个孩子节点,那么相距最远的两 个节点 U 和 V 之间的路径与这个根节点的关系有两种情况: 1. 若路径经过根Root,则U和V是属于不同子树的,且它们都是该子树中到根节点最远 的节点,否则跟它们的距离最远相矛盾。这种情况如图3-13所示:
图 3-13
相距最远的节点在左右最长的子树中

2. 如果路径不经过Root,那么它们一定属于根的K个子树之一。并且它们也是该子树中 相距最远的两个顶点。如图3-14中的节点A:
图 3-14
相距最远的节点在某个子树下
因此,问题就可以转化为在子树上的解,从而能够利用动态规划来解决。 设第 K 棵子树中相距最远的两个节点:Uk 和 Vk,其距离定义为 d(Uk, Vk),那么节点 Uk 或 Vk 即为子树 K 到根节点 Rk 距离最长的节点。不失一般性,我们设 Uk 为子树 K 中到根 节点 Rk 距离最长的节点,其到根节点的距离定义为 d(Uk, R)。取 d(Ui, R)(1≤i≤k)中 最大的两个值 max1 和 max2,那么经过根节点 R 的最长路径为 max1+max2+2,所以树 R 中 相距最远的两个点的距离为:max{d(U1, V1), …, d(Uk, Vk),max1+max2+2}。 采用深度优先搜索如图 3-15,只需要遍历所有的节点一次,时间复杂度为 O(|E|)= O (|V|-1),其中 V 为点的集合,E 为边的集合。
图 3-15
深度遍历示意图?
示例代码如下,我们使用二叉树来实现该算法。 代码清单 3-11
// 数据结构定义

数据结构中二叉树各种题型详解及程序

树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树有关的题目基本都可以用递归思想解决,当然有些题目非递归解法也应该掌握,如非递归遍历节点等等。本文努力对二叉树相关题目做一个较全的整理总结,希望对找工作的同学有所帮助。 二叉树节点定义如下: structBinaryTreeNode { intm_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; 相关链接: 轻松搞定面试中的链表题目 题目列表: 1. 求二叉树中的节点个数 2. 求二叉树的深度 3. 前序遍历,中序遍历,后序遍历 4.分层遍历二叉树(按层次从上往下,从左往右) 5. 将二叉查找树变为有序的双向链表 6. 求二叉树第K层的节点个数 7. 求二叉树中叶子节点的个数 8. 判断两棵二叉树是否结构相同 9. 判断二叉树是不是平衡二叉树 10. 求二叉树的镜像 11. 求二叉树中两个节点的最低公共祖先节点 12. 求二叉树中节点的最大距离 13. 由前序遍历序列和中序遍历序列重建二叉树 14.判断二叉树是不是完全二叉树 详细解答 1. 求二叉树中的节点个数 递归解法: (1)如果二叉树为空,节点个数为0 (2)如果二叉树不为空,二叉树节点个数= 左子树节点个数+ 右子树节点个数+ 1 参考代码如下: 1.int GetNodeNum(BinaryTreeNode * pRoot) 2.{ 3.if(pRoot == NULL) // 递归出口 4.return 0; 5.return GetNodeNum(pRoot->m_pLeft) + GetNodeNum(pRoot->m_pRight) + 1; 6.}

二叉树习题及答案(考试学习)

1.设一棵完全二叉树共有699个结点,则在该二叉树中的叶子结点数? 1根据“二叉树的第i层至多有2^(i ? 1)个结点;深度为k的二叉树至多有2^k ? 1个结点(根结点的深度为1)”这个性质: 因为2^9-1 < 699 < 2^10-1 ,所以这个完全二叉树的深度是10,前9层是一个满二叉树, 这样的话,前九层的结点就有2^9-1=511个;而第九层的结点数是2^(9-1)=256 所以第十层的叶子结点数是699-511=188个; 现在来算第九层的叶子结点个数。 由于第十层的叶子结点是从第九层延伸的,所以应该去掉第九层中还有子树的结点。因为第十层有188个,所以应该去掉第九层中的188/2=94个; 所以,第九层的叶子结点个数是256-94=162,加上第十层有188个,最后结果是350个 2完全二叉树:若二叉树中最多只有最下面两层的结点的度可以小于2,并且最下面一层的结点(叶结点)都依次排列在该层最左边的位置上,这样的二叉树为完全二叉树。 比如图: 完全二叉树除叶结点层外的所有结点数(叶结点层以上所有结点数)为奇数,此题中,699是奇数,叶结点层以上的所有结点数为保证是奇数,则叶结点数必是偶数,这样我们可以立即选出答案为B! 如果完全二叉树的叶结点都排满了,则是满二叉树,易得满二叉树的叶结点数是其以上所有层结点数+1比如图: 此题的其实是一棵满二叉树,我们根据以上性质,699+1=700,700/2=350,即叶结点数为350,叶结点层以上所有结点数为350-1=349。 3完全二叉树中,只存在度为2的结点和度为0的结点,而二叉树的性质中有一条是:n0=n2+1;n0指度为0的结点,即叶子结点,n2指度为2的结点,所以2n2+1=699 n2=349;n0=350 2.在一棵二叉树上第5层的结点数最多是多少 一棵二叉树,如果每个结点都是是满的,那么会满足2^(k-1)1。 所以第5层至多有2^(5-1)=16个结点! 3.在深度为5的满二叉树中,叶子结点的个数为 答案是16 ~ 叶子结点就是没有后件的结点~ 说白了~ 就是二叉树的最后一层~ 深度为K的二叉树~ 最多有2^k-1个结点~ 最多有2^(k-1)个结点~ 所以此题~ 最多有2^5-1=31个结点~ 最多有2^(5-1)=16个叶子结点~ 4.某二叉树中度为2的结点有18个,则该二叉树中有几个叶子结点? 结点的度是指树中每个结点具有的子树个数或者说是后继结点数。 题中的度为2是说具有的2个子树的结点; 二叉树有个性质:二叉树上叶子结点数等于度为2的结点数加1。 5.在深度为7的满二叉树中,度为2的结点个数为多少, 就是第一层只有一个节点,他有两个子节点,第二层有两个节点,他们也都有两个子节点以此类推,所以到第6层,就有2的5次方个节点,他们都有两个子节点

数据结构 求二叉树的深度

第五次上机实验报告 计科093xx川5310 实验内容: 求二叉树的xx 程序清单: #include #include #define OK 1 #define OVERFLOW -2 typedef int status; typedef struct BiNode//二叉链表{char Data; struct BiNode* lChild; struct BiNode* rChild; }BiNode,*pBiNode; typedef struct SNode/*链栈的结点类型*/{pBiNode elem; /*栈中的元素是指向二叉链表结点的指针*/ struct SNode *next; }SNode; structlink//队列链表{structBiNode *p; structlink*next; };

status CreateTree(BiNode** pTree); intTreeHeight (BiNode* pTree);//二叉树的高度 status Visit(char Data); voidDisplay(BiNode* pTree,int Level); BiNode *pRoot=NULL; status CreateTree(BiNode** pTree) /*Input Example: abd##e##cf##g##*/{char ch; scanf("%c",&ch); if(ch=='#'){(*pTree)=NULL;}else{if(!((*pTree)=(BiNode*)malloc(sizeof(BiNode)))){ exit(OVERFLOW);}(*pTree)->Data=ch; CreateTree(&((*pTree)->lChild)); CreateTree(&((*pTree)->rChild));}return OK;}int TreeHeight(BiNode* pTree)//二叉树的高度{int hl ,hr ; //左右子树的高度 if (pTree == NULL) return 0 ; else hl = TreeHeight(pTree-> lChild); hr = TreeHeight (pTree-> rChild); if (hl>hr) return (hl +1); else return (hr +1);}status Visit(char Data){printf("%c",Data);

二叉树中叶子结点的个数

题目一:统计二叉树中叶子结点的个数 [问题描述] 已知一棵二叉树,求该二叉树中叶子结点的个数。 [基本要求] (1)采用二叉链表作存储结构,存储二叉树; (2)输出前序、中序、后序遍历该二叉树的遍历结果; (3)设计递归算法求叶子结点的个数; (4)设计非递归算法求叶子结点的个数。 [测试数据] [源代码] //tree1.h #ifndef tree1_H #define tree1_H #include template struct Node { T data; Node *lchild,*rchild; }; template class Tree { Node *root; Node *Creat(Node *bt); void Release(Node *bt); void PreOrder(Node *bt); void InOrder(Node *bt); void PostOrder(Node *bt); int CountLeaf1(Node *bt); int CountLeaf2(Node *bt); public: Tree() {root=Creat(root);} ~Tree() {Release(root);}

void PreOrder() {PreOrder(root);} void InOrder() {InOrder(root);} void PostOrder() {PostOrder(root);} void CountLeaf1() {cout< #include"tree1.h" using namespace std; template Node *Tree::Creat(Node *bt) { T ch; cin>>ch; if(ch=='#') return NULL; else { bt=new Node; bt->data=ch; bt->lchild=Creat(bt->lchild); bt->rchild=Creat(bt->rchild); } return bt; } template void Tree::Release(Node *bt) { if(bt!=NULL) { Release(bt->lchild); Release(bt->rchild); delete bt; } } template void Tree::PreOrder(Node *bt) { if(bt==NULL) return; else { cout<data<<" "; PreOrder(bt->lchild); PreOrder(bt->rchild); } } template void Tree::InOrder(Node *bt) { if(bt==NULL) return;

二叉树的性质总结

一、二叉树的性质 性质1、二叉树的第i 层上至多有2 i-1(i ≥1)个结点。用数学归纳法证明 推广:k 叉树(或度为k 的树)的第i 层上至多有k i-1(i ≥1)个结点 性质2、度为h 的二叉树中至多含有2h-1个结点。 21-1 + 2 2-1+……+ 2 h-1 = 2 h -1 推广:深度为h 的k 叉树(或度为k 的树)中至多含有 (k h -1)/(k-1)个结点 k 1-1 + k 2-1+……+ k h-1 =( k h -1)/(k-1) 性质3、若在任意一棵二叉树中,有n0个叶子结点, 有n2个度为2的结点,则:n0=n2+1 证明:设:有n0个叶子结点,有n1个度为1的结点,有n2个度为2的结点, 则二叉树中结点总数为:n=n0+n1+ n2 (1) 设分支的总数为m,则:m= n1+2 n2 (2) 因为n=m+1(3) 所以: n0+n1+ n2 = n1+2 n2 +1 整理得: n0= n2+1 推广: 度为k 的树有n 1个度为1的结点, n 2个度为2的结点,n k 个度为k 的结点则n 0为: 性质3推广的证明于性质3的证明 设:有n 0个叶子结点,有n 1个度为1的结点, n 2个度为2的结点,n k 个度为k 的结点 则结点总数为:n=n 0+n 1+ n 2 +……+n k (1) 设分支的总数为m,则:m= n 1+2 n 2+……+kn k 因为n=m+1(3) 所以:n 0+n 1+ n 2 +……+n k = n 1+2 n 2+……+kn k +1 整理得: n 0= 0n 1+1n 2+……+(k-1)n k +1 性质4、具有n 个结点的完全二叉树,其深度为?㏒2n ?+1 证明:设n 个结点的完全二叉树的深度为k ,根据性质2可知,k-1层满二叉树的结点总数为: 2k-1-1 k 层满二叉树的结点总数为: 2k -1 显然有: 2k-1 - 1 < n ≤ 2k - 1 [ 2k- 1 ≤ n < 2k 取对数有:k -1 ≤ log 2n < k 因为k 是整数,所以k -1 = ?log 2n ? , k= ?㏒2n ?+1 结论成立。 推广: 具有n 个结点的完全k 叉树,其深度为? log k (k-1) n ? +1 设n 个结点的完全k 叉树的深度为h ,根据性质2推广可知, h-1层满k 叉树的结点总数为:(k h-1-1)/(k-1) h 层满二叉树的结点总数为:(k h -1)/(k-1) 显然有: (k h-1-1)/(k-1) < n ≤ (k h -1)/(k-1) k h-1-1 <(k-1) n ≤ k h -1 k h-1 ≤ (k-1) n< k h 取对数有:h -1 ≤ log k (k-1) n 1,则该结点的双亲结点编号为 [k/2 ] 。 (2)若2k<=n,则编号为k 的左孩子结点编号为2k;否则该结点无左孩子结点(显然也没有右孩子结点)。 ∑ k i=1 ( i- 1)n i +1

8.求二叉树叶子节点的个数并输出

求二叉树叶子节点的个数并输出 实验目的: 设二叉树采用链式存储结构,试设计一个算法计算一颗给定二叉树中叶子结点的数目。 实验类容与步骤: (1)建立一颗二叉树; (2)先序遍历输出该二叉树; (3)计算出该二叉树的叶子结点个数; (4)输出叶子结点个数; 实验平台: Windows xp 操作系统,VC 6.0集成环境 实验设计方案: (1)输入扩展先序遍历序列并建立对应的二叉树. 输入#表示输入的二叉树元素为空。输入回车键表示输入结束。 (2)先序输出当前二叉树的叶子节点和叶子节点个数. 源程序代码: #include #include typedef struct Node { char data; struct Node *LChild; struct Node *RChild; struct Node *Parent; }BiNode,*BiTree; //函数声明 void Print(BiTree *root); void Choose(int choice,BiTree *root); void ReadPreOrder(BiTree *root); void PrintPreOrder(BiTree root); void ReadPreOrder(BiTree *root); void PreOrder(BiTree root,int *count); //主函数 int main() { BiTree root; root=NULL;//初始化无头结点 system("color a"); Print(&root); while(true)

求一棵二叉树的深度和双分支结点的个数

二叉树采用二叉链表结构表示。设计并实现如下算法:求一棵二叉树的深度和双分支结点的个数。 #include #include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct BiTNode { /*数结构*/ char data; struct BiTNode *lchild,*rchild; } BiTNode,*BiTree; BiTree CreateBiTree() { /*递归建树*/ char ch; BiTree T; scanf("%c",&ch); if(ch==' ') T=NULL; else { T=(BiTNode *)malloc(sizeof(BiTNode));/*分配存储空间*/ T->data=ch;/*生存根节点*/ T->lchild=CreateBiTree();/*构造右子树*/ T->rchild=CreateBiTree();/*构造左子树*/ } return (T); } int DeepTree(BiTree T) { /*求深度*/ int N1,N2; if(T==NULL) return 0; else N1=DeepTree(T->rchild);/*遍历左子树*/ N2=DeepTree(T->lchild);/*遍历右子树*/ if(N1>N2) return N1+1; else return N2+1; }

int NumNode(BiTree T) { /*求双节点个数*/ int num1,num2; if(T==NULL) return 0; num1=NumNode(T->rchild);/*遍历左子树*/ num2=NumNode(T->lchild);/*遍历右子树*/ if(T->rchild!=NULL&T->lchild!=NULL) return (num1+num2+1); else return (num1+num2); } void main() { BiTree T; int i,k; printf("please create tree:\n"); T=CreateBiTree(); printf("\n"); i=DeepTree(T); printf("the tree's deep is \n%d",i); printf("\n"); k=NumNode(T); printf("the two node is \n%d",k); getch(); }

相关文档
最新文档