二叉树叶子结点个数计算

二叉树叶子结点个数计算
二叉树叶子结点个数计算

南通大学数据结构实践教程

实验报告册

1.程序设计简介

已知一棵二叉树,求该二叉树中叶子结点的个数。

2.基本要求

(1)设计二叉树的二叉链表为存储结构

(2)设计求叶子结点个数的递归算法

(3)输入:一颗二叉树

(4)输出:二叉树中叶子结点的个数

3.实现提示

(1)存储设计

二叉树采用二叉链表为存储结构

(2)算法设计

求二叉树中叶子结点个数,即求二叉树的所有结点中左、右子

树均为空的结点个数之和。可以将此问题转化为遍历问题,在遍历中“访问一个结点”时判断该结点是不是叶子,若是则将计数器累加。

4.源程序

#include

#include

using namespace std;

struct BiNode //二叉树的结点结构

{

char data;

BiNode *lchild, *rchild;

};

class BiTree

{

public:

BiTree( ); //构造函数,初始化一棵二叉树,其前序序列由键盘输入

~BiTree(void); //析构函数,释放二叉链表中各结点的存储空间BiNode* Getroot(); //获得指向根结点的指针

void PreOrder(BiNode *root); //前序遍历二叉树

void BiTree::yezi(BiNode *root,int &n); private:

BiNode *root; //指向根结点的头指针

BiNode *Creat( ); //有参构造函数调用

void Release(BiNode *root); //析构函数调用};

BiTree::BiTree( )

{

root = Creat( );

}

BiTree::~BiTree(void)

{

Release(root);

}

BiNode* BiTree::Getroot( )

{

return root;

}

void BiTree::PreOrder(BiNode *root)

{

if(root==NULL) return;

else{

cout<data<<" ";

PreOrder(root->lchild);

PreOrder(root->rchild);

}

}

void BiTree::yezi(BiNode *root,int &n)

{

if(root)

{

if(root->lchild==NULL&&root->rchild==NULL)

n++;

yezi(root->lchild,n);

yezi(root->rchild,n);

}

}

BiNode* BiTree::Creat( )

{

BiNode *root;

char ch;

cin>>ch;

if (ch=='#') root = NULL;

else{

root = new BiNode; //生成一个结点

root->data=ch;

root->lchild = Creat( ); //递归建立左子树

root->rchild = Creat( ); //递归建立右子树}

return root;

}

void BiTree::Release(BiNode *root)

{

if (root!= NULL){

Release(root->lchild); //释放左子树

Release(root->rchild); //释放右子树

delete root;

}

}

void main()

{ cout<<"请输入二叉树的结点数据:";

BiTree bt; //创建一棵树

BiNode *root = bt.Getroot( ); //获取指向根结点的指针int n=0;

cout<<"------前序遍历------ "<

bt.PreOrder(root);

bt.yezi(root,n);

cout<

cout<<"叶子节点数:"<

cout<

}

5.运行与测试

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 || !s.empty())

{

if(NULL!=root)

{

s.push(root);

root=root->lchild;

}

else

{

root=s.top();

// cout<data<<" ";

if(NULL==root->lchild && NULL==root->rchild)

++sum;

s.pop();

root=root->rchild;

}

}

cout<

}

int main()

{

root=new node;

root->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;

b->lchild=b1;

b->rchild=b2;

a1->lchild=NULL;

a1->rchild=NULL;

a2->lchild=NULL;

a2->rchild=NULL;

b1->lchild=NULL;

b1->rchild=NULL;

b2->lchild=NULL;

b2->rchild=NULL;

mid(root);

return 0;

}

数据结构第六章树和二叉树习题及答案

习题六树和二叉树 一、单项选择题 1.以下说法错误的是() A. 树形结构的特点是一个结点可以有多个直接前趋 B. 线性结构中的一个结点至多只有一个直接后继 C. 树形结构可以表达(组织)更复杂的数据 D. 树(及一切树形结构)是一种”分支层次”结构 E. 任何只含一个结点的集合是一棵树 2. 下列说法中正确的是() A. 任何一棵二叉树中至少有一个结点的度为2 B. 任何一棵二叉树中每个结点的度都为2 C. 任何一棵二叉树中的度肯定等于2 D. 任何一棵二叉树中的度可以小于2 3. 讨论树、森林和二叉树的关系,目的是为了() A. 借助二叉树上的运算方法去实现对树的一些运算 B. 将树、森林按二叉树的存储方式进行存储 C. 将树、森林转换成二叉树 D. 体现一种技巧,没有什么实际意义4.树最适合用来表示() A. 有序数据元素 B .无序数据元素 C.元素之间具有分支层次关系的数据 D .元素之间无联系的数据 5.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是()A.9 B .11 C .15 D .不确定 6. 设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1, M2和M3与森林F 对应的二叉树根结点的右子树上的结点个数是()。 A.M1 B .M1+M2 C .M3 D .M2+M3 7.一棵完全二叉树上有1001个结点,其中叶子结点的个数是() A.250 B .500 C .254 D .505 E .以上答案都不对 8. 设给定权值总数有n 个,其哈夫曼树的结点总数为() A. 不确定 B . 2n C . 2n+1 D . 2n-1 9.二叉树的第I 层上最多含有结点数为() I I-1 I-1 I A.2I B .2 I-1 -1 C .2 I-1 D .2 I -1 10.一棵二叉树高度为h, 所有结点的度或为0,或为2,则这棵二叉树最少有()结点A.2h B .2h-1 C .2h+1 D .h+1 11. 利用二叉链表存储树,则根结点的右指针是()。 A.指向最左孩子 B .指向最右孩子 C .空D .非空 12.已知一棵二叉树的前序遍历结果为为()。 A.CBEFDA B .FEDCBA 13.已知某二叉树的后序遍历序列是()。 ABCDEF中序遍历结果 为 C .CBEDFA D dabec, 中序遍历序列是 CBAEDF则后序遍历的结 果 .不定 debac , 它的前序遍历是

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

#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)

二叉树求节点数

二叉树求节点数 #include #include #include //函数状态码定义 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define INFEASIBLE -2 #define NULL 0 typedef int Status; typedef int TElemType; typedef struct BiTNode{ TElemType data; struct BiTNode *lchild,*rchild; }BitNode, *BiTree; Status PrintTElem(TElemType e) { printf("%d ",e); return OK; } Status CreateBiTree(BiTree &T){ TElemType e; scanf("%d",&e); if(e==0 )T=NULL; else{ T=(BiTree)malloc(sizeof(BiTNode)); if(!T)exit(OVERFLOW); T->data=e; CreateBiTree(T->lchild); CreateBiTree(T->rchild);

} 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; } int NodeCount(BiTree T){ //递归法统计所有结点的个数 int n; if(T==NULL)n=0; else n=1+NodeCount(T->lchild)+NodeCount(T->rchild); return n; } void main() { BiTree T; CreateBiTree(T); printf("二叉树T的先序输出序列为:"); PreOrderTraverse(T,PrintTElem); printf("\n"); printf("二叉树T的叶子节点数为 %d\n",NodeCount(T)); }

二叉树叶子结点个数计算

计算二叉树叶子结点 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;

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

实验叶子结点的计算 姓名: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;

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

树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树有关的题目基本都可以用递归思想解决,当然有些题目非递归解法也应该掌握,如非递归遍历节点等等。本文努力对二叉树相关题目做一个较全的整理总结,希望对找工作的同学有所帮助。 二叉树节点定义如下: 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.}

数据结构—— 树和二叉树知识点归纳

第6章树和二叉树 6.1 知识点概述 树(Tree)形结构是一种很重要的非线性结构,它反映了数据元素之间的层次关系和分支关系。在计算机科学中具有广泛的应用。 1、树的定义 树(Tree)是n(n≥0)个数据元素的有限集合。当n=0时,称这棵树为空树。在一棵非空树T中: (1)有一个特殊的数据元素称为树的根结点,根结点没有前驱结点。 (2)若n>1,除根结点之外的其余数据元素被分成m(m>0)个互不相交的集合T1,T2,…,Tm,其中每一个集合Ti(1≤i≤m)本身又是一棵树。树T1,T2,…,Tm称为这个根结点的子树。 2、树的基本存储结构 (1)双亲表示法 由于树中的每一个结点都有一个唯一确定的双亲结点,所以我们可用一组连续的 存储空间(即一维数组)存储树中的结点。每个结点有两个域:一个是data域,存放结点信息,另一个是parent域,用来存放双亲的位置(指针)。 (2)孩子表示法 将一个结点所有孩子链接成一个单链表形,而树中有若干个结点,故有若干个单 链表,每个单链表有一个表头结点,所有表头结点用一个数组来描述这种方法通常是把每个结点的孩子结点排列起来,构成一个单链表,称为孩子链表。 (3)双亲孩子表示法 双亲表示法是将双亲表示法和孩子表示法相结合的结果。其仍将各结点的孩子结点分别组成单链表,同时用一维数组顺序存储树中的各结点,数组元素除了包括结点本身的信息和该结点的孩子结点链表的头指针之外,还增设一个域,存储该结点双亲结点在数组中的序号。 (4)孩子兄弟表示法 这种表示法又称为树的二叉表示法,或者二叉链表表示法,即以二叉链表作为树的存储结构。链表中每个结点设有两个链域,分别指向该结点的第一个孩子结点和下一个兄弟(右兄弟)结点。 3、二叉树的定义 二叉树(Binary Tree)是个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点。 4、满二叉树 定义:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上,这样的一棵二叉树称作满二叉树。 5、完全二叉树 定义:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。完全二叉树的特点是:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。 6、二叉树的性质

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

#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)); }

习题树和二叉树

习题6树和二叉树 说明: 本文档中,凡红色字标出的题请提交纸质作业,只写题号和答案即可。 6.1 单项选择题 1. 2. A . 15 由于二叉树中每个结点的度最大为 2,所以二叉树是一种特殊的树,这种说法 A.正确 假定在一棵二叉树中, B . 16 C . 17 3. 按照二叉树的定义, A. 3 4. 按照二叉树的定义, A. 5 5. 6. 7. 8. B.错误 双分支结点数为15,单分支结点数为30个,则叶子结点数为 B 个。 D . 具有 B. 4 具有 B. 6 深度为5的二叉树至多有 A. 16 B. 32 47 3个结点的不同形状的二叉树有 _ C. 5 D. 6 3个不同数据结点的不同的二叉树有 C. 30 _C__个结点。 C. 31 D. 32 C 种。 C 种。 设高度为h 的二叉树上只有度为 0和度为 D. 10 2的结点,则此类二叉树中所包含的结点数至少为 B. 2h-1 C. 2h+1 m 个树叶,n 个结点,深度为h ,则__A__ B. h+m=2 n C. m=h-1 D. h+1 A. 2h 对一个满二叉树, A. n=h+m 任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序 A.不发生改变 B.发生改变 如果某二叉树的前根次序遍历结果为 B. vwuts C. wuvts O D. n=2 h -1 A C.不能确定 D.以上都不对 stuwv ,中序遍历为uwtvs ,那么该二叉树的后序为 __C__。 D. wutsv 9. A. uwvts 10. 二叉树的前序遍历序列中,任意一个结点均处在其子女结点的前面,这种说法 正确 B.错误 11. 某二叉树的前序遍历结点访问顺序是 序遍历的结点访问顺序是 _D__。 A. bdgcefha B. gdbecfha 12. 在一非空二叉树的中序遍历序列中, A.只有右子树上的所有结点 C.只有左子树上的部分结点 abdgcefh ,中序遍历的结点访问顺序是 13. 如图6.1所示二叉树的中序遍历序列是 C. bdgaechf D. gdbehfca 根结点的右边 _A_。 B.只有右子树上的部分结点 D.只有左子树上的所有结点 B_。 C. dbaefcg D. defbagc 序遍 A. abcdgef 序列 B. dfebagc abdgcefh B. dgbaechf D. abcdefgh 为一棵二叉树上的两个结点, 前的条件是 B a 在b 的右方 a 是b 的祖先 a . C . 已知某二叉树的后序遍历序列是 B. deca b C. deab c D . a 是b 的子孙 dabec ,中序遍历序列是 D. cedba 16. A. acbe d 17.实现任意二叉树的后序遍历的非递归算法而不使用栈结构, 结构。 A.二叉链表 B.广义表存储结构 C.三叉链表 A. dgbaechf ,则其后 二叉树如图6.2所示,其中序遍历的 疋 D 。 B . a 在b 的左方 debac,它的前序遍历序列是 最佳方案是二叉树采用 D.顺序存储结构 C. 在中 C 存储

实现二叉树中所有节点左右子树的交换

数据结构课程设计 实验报告

题目名称:实现二叉树中所有节点左右子树的交换 学院:信息科学与工程学院 专业班级:计算机科学与技术 1003 班 姓名:叶成功 学号: 12081414 指导教师:陈国良教授李立三教授 日期: 2012年7月3日 目录 一、问题描述 (4) 二、基本要求 (4) 三、数据结构的设计 (4) 1、结点的数据结构 (5) 2、基本操作 (5) 四、软件模块结构图 (5) 五、程序设计思想 (6) 1、程序设计基本思想 (6) 2、程序设计基本思想 (7) 六、程序流程图 (7) 1、创建函数 (7) 2、前序遍历函数 (8) 3、中序遍历函数 (9) 4、后序遍历函数 (10) 5、层序遍历函数 (11) 6、左右子树交换函数 (13)

7、二叉树打印函数 (14) 8、遍历调用函数 (15) 9、菜单函数 (16) 10、主函数 (17) 七、源程序代码 (19) 八、调试分析 (25) 九、数据测试 (26) 1、主菜单界面 (27) 2、建立一棵有二十个结点的完全二叉树 (28) 3、打印二叉树 (28) 4、遍历二叉树 (28) 5、二叉树左右子树交换 (28) 6、交换后打印二叉树 (29) 7、交换后二叉树的遍历 (29) 8、退出程序 (29) 十、用户使用手册 (29) 十一、心得体会 (29)

一、问题描述 二叉树是一种常见的特殊的树型结构,在计算机领域有着极为广泛的应用。在二叉树的一些应用中,常常要求在树中查找具有某些特征的结点或者对树中全部结点逐一进行某种处理,这就提出了遍历二叉树。根据遍历的方向的不同,有前序遍历、中序遍历、后序遍历以及层序遍历。在本次课程设计中,要求学生通过编写程序完成对二叉树的一些操作,比如可以构造二叉树、打印二叉树、遍历二叉树以及对左右子树进行交换等等。 二、基本要求 要求:。构造一颗20个节点的完全二叉树或者20个节点以上的满二叉树。 实现如下步骤: (1)实现二叉树的构造过程,并打印出二叉树 (2)对该二叉树分别用层序、前序、中序和后序四种不同的方法进行遍历; (3)将该二叉树的所有左右子树进行交换,得到新的二叉树,并打印出该二叉树; (4)对新获得的二叉树分别用层序、前序、中序和后序四种不同的方法进行遍历。 三、数据结构的设计 由数据结构中二叉树的定义可知,二叉树的结点由一个数据元素和分别指向其左、右子树的两个分支构成,所以在本程序二叉树的构造是采用二叉链表的链式存储结构,链表中的结点应包含三个域:数据域和左、右孩子的指针域。这种存储结构可以方便二叉树的建立以及遍历。

实现二叉树中所有节点左右子树的交换

实现二叉树中所有节点左右子树的交换 IMB standardization office【IMB 5AB- IMBK 08- IMB 2C】

数据结构课程设计 实验报告 题目名称:实现二叉树中所有节点左右子树的交换学院:信息科学与工程学院 专业班级:计算机科学与技术1003班 姓名:叶成功 学号: 指导教师:陈国良教授李立三教授 日期:2012年7月3日 目录

一、问题描述 二叉树是一种常见的特殊的树型结构,在计算机领域有着极为广泛的应用。在二叉树的一些应用中,常常要求在树中查找具有某些特征的结点或者对树中全部结点逐一进行某种处理,这就提出了遍历二叉树。根据遍历的方向的不同,有前序遍历、中序遍历、后序遍历以及层序遍历。在本次课程设计中,要求学生通过编写程序完成对二叉树的一些操作,比如可以构造二叉树、打印二叉树、遍历二叉树以及对左右子树进行交换等等。

二、基本要求 要求:。构造一颗20个节点的完全二叉树或者20个节点以上的满二叉树。 实现如下步骤: (1)实现二叉树的构造过程,并打印出二叉树 (2)对该二叉树分别用层序、前序、中序和后序四种不同的方法进行遍历; (3)将该二叉树的所有左右子树进行交换,得到新的二叉树,并打印出该二叉树; (4)对新获得的二叉树分别用层序、前序、中序和后序四种不同的方法进行遍历。 三、数据结构的设计 由数据结构中二叉树的定义可知,二叉树的结点由一个数据元素和分别指向其左、右子树的两个分支构成,所以在本程序二叉树的构造是采用二叉链表的链式存储结构,链表中的结点应包含三个域:数据域和左、右孩子的指针域。这种存储结构可以方便二叉树的建立以及遍历。 1、结点的数据结构 structnode { chardata; structnode*lchild,*rchild; } 2、基本操作 voidCreate(BiTNode**p) 初始条件:按照结点的结构体构造二叉树; 操作结果:构造一棵二叉树。 voidPreOrderTraverse(BiTreeT)

数据结构二叉树习题含答案

第6章树和二叉树 1.选择题 (1)把一棵树转换为二叉树后,这棵二叉树的形态是()。 A.唯一的B.有多种 C.有多种,但根结点都没有左孩子D.有多种,但根结点都没有右孩子 (2)由3 个结点可以构造出多少种不同的二叉树?() A.2 B.3 C.4 D.5 (3)一棵完全二叉树上有1001个结点,其中叶子结点的个数是()。 A.250 B. 500 C.254 D.501 (4)一个具有1025个结点的二叉树的高h为()。 A.11 B.10 C.11至1025之间 D.10至1024之间(5)深度为h的满m叉树的第k层有()个结点。(1=

计算二叉树结点个数

#include #include #define maxlen 50 #define NULL 0 typedef struct node{ char data;//data域用来存放结点信息 struct node *lchild,*rchild;//lchild用来存放其左孩子的地址,rchild用来存放其右孩子的地址 }Bitree; Bitree *Q[maxlen];//定义指针队列 Bitree *creatBitree(){ char ch; int front=1,rear=0;//置空队列 Bitree *T,*S; T=NULL;//置空二叉树 ch=getchar(); while(ch!='#'){//以‘#’作为结束符 S=NULL;//当输入元素为空时,无需申请空间 if(ch!='@'){//当不是虚结点时 S=(Bitree *)malloc(sizeof(Bitree));//为所得元素申请内存 S->data=ch;//将元素值放入data域存储 S->lchild=S->rchild=NULL;//将其左右孩子置空 } rear++; Q[rear]=S;//将结点地址入队 if(rear==1){ T=S;}//输入的第一个元素为根结点 else{ if(S!=NULL&&Q[front]!=NULL) if(rear%2==0){ Q[front]->lchild=S;//能被2整除的rear位存储的皆为左孩子,将其与父节点连接 } else{ Q[front]->rchild=S;//不能被2整除的rear位存储的皆右左孩子,将其与父节点连接 } if(rear%2==1){ front++; } } ch=getchar(); } return T; }

二叉树中叶子结点的个数

题目一:统计二叉树中叶子结点的个数 [问题描述] 已知一棵二叉树,求该二叉树中叶子结点的个数。 [基本要求] (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;

二叉树节点的插入和查找

二叉树节点的插入和查找 #include #include typedef int elemtype; typedef struct Node { elemtype data; struct Node *Lchild; struct Node *Rchild; }TreeNode; typedef TreeNode *bt; Search_data(TreeNode *t,TreeNode **p,TreeNode **q, elemtype x) //查找函数 { int flag=0; *p=NULL; *q=t; while(*q) {

if (x>(*q)->data) { *p=*q; *q=(*q)->Rchild; } else { if (x<(*q)->data) { *p=*q; *q=(*q)->Lchild; } else { flag=1; break; } } } return flag; }

InsertNode(TreeNode **t,elemtype x) //插入函数{ int flag=0; TreeNode *q,*s; TreeNode *p=*t; if (!Search_data(*t,&p,&q,x)) { s=(TreeNode *)malloc(sizeof(TreeNode)); s->data=x; s->Lchild=NULL; s->Rchild=NULL; flag=1; if(!p) *t=s; else { if(x>p->data) p->Rchild=s; else p->Lchild=s; } }

查找二叉树的节点的父节点

#include "stdio.h" #include "malloc.h" #include "process.h" #define max 100 typedef struct node{ int data; struct node *lchild,*rchild; }Bitree; Bitree *a[max]; int re[max]; Bitree *Build() { int x; int front,rear; Bitree *t,*s; t=NULL; front=1;rear=0; printf("请输入树以#结束\n"); scanf("%d",&x); while(x!=0) { s=NULL; if(x!=-1) { s=(Bitree *)malloc(sizeof(Bitree)); s->data=x;s->lchild=s->rchild=NULL; } rear++; a[rear]=s; if(rear==1) t=s; else { if(s!=NULL&&a[front]!=NULL) if(rear%2==0) a[front]->lchild=s; else a[front]->rchild=s; if(rear%2==1) front++; } scanf("%d",&x); } return t; } void Output(int i) { int j; printf("祖先节点为: \n"); for(j=0;j

printf("%4d",re[j]); printf("\n"); getchar(); exit(0); } void Find(Bitree *t,int u,int n) { if(t==NULL) return; if (t->data==u) Output(n); if (t->lchild==NULL&&t->rchild==NULL) return; else re[n]=t->data; Find(t->lchild,u,n+1); Find(t->rchild,u,n+1); } void main() { Bitree *t; int u; t=Build(); printf("请输入待查找数字: "); scanf("%d",&u); Find(t,u,0); printf(" 查无此数\n"); }

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)

二叉树计算叶子节点的算法(数据结构)C语言版

/* HELLO.C -- Hello, world */ #include "stdio.h" #include "conio.h" #include "malloc.h" /*=============二叉树的二叉链表存储表示===================*/ typedef struct BiTNode {int data; struct BiTNode *lchild,*rchild;/*左右孩子指针*/ }; typedef struct BiTNode chenchen; /*=============构建二叉树======================*/ chenchen *create() {int x; static int z=0; chenchen *p; z=z+1; printf("%3d: ",z); scanf("%3d",&x); if(x!=0) {p=(chenchen*)malloc(sizeof(chenchen)); p->data=x; p->lchild=create(); p->rchild=create();} else p=0; return p; } /*=====构建函数计算叶子节点的个数======*/ int count(chenchen *t){ static int y=0; if(t) {count(t->lchild); count(t->rchild); if(t->lchild==0&&t->rchild==0) {y++;}} return y;} /*============主函数===============*/ main() { chenchen *T ;int c; printf("Input the data:\n"); T=create(); if(T){c=count(T);printf("\nNumber=%d",c);} else{printf("Empty");}printf("\n"); getch(); }

相关文档
最新文档