关于二叉树的一道C编程题,请各位高手帮忙写个完整代码。
第一个你创建一个类Book,里面写一堆属性,就像你图里的 id、作者、书名。。等等
然后创建 List li = new List( );
新建Book类对象添加给li集合
第2个用字典来,照你图里应该是取巧。
把 id作为字典的键, 书名、作者、出版社等串接为一个字符串后作为字典的值。
就这玩意还要代码?你直接把邮箱贴上来吧 我给你传过去 估计你都没学过
楼主你好!
这是我的思路:
a,b)说明 根结点<左结点<右结点
c)说明这是一棵除了最后一层不满其余层全满的完全二叉树
我觉得a,b的条件可以有很多种解决方法,这里用最简单的办法.就是按每一层的从小到大排序.
因此,第一步先将数组排序(快速排序,插入排序.....任何一种) nlgn内搞定.
第二步,就是完全二叉树的插入法.完全二叉树插入法可以用水平遍历的办法的扩展,这里不细说.
第三步,统计叶子节点值和输出叶子节点值(这个太简单,只需要输出left和right都为空的结点即可.)
完整代码:
排序步骤忽略.
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int value;
node* left;
node* right;
node(int val):value(val),left(NULL),right(NULL){}
};
struct Tree
{
node* root;
Tree():root(NULL){}
};
node* HorizInsert(node* root,node* z)
{
if(!root)
{
root=z;
return root;
}
queue<node*> q;
q.push(root);
while(!q.empty())
{
node* Front=q.front();
q.pop();
if(Front->left==NULL)
{
Front->left=z;
return root;
}
if(Front->right==NULL)
{
Front->right=z;
return root;
}
if(Front->left)
q.push(Front->left);
if(Front->right)
q.push(Front->right);
}
return root;
}
void HorizPrint(node* root)
{
if(!root) return ;
queue<node*> q;
q.push(root);
int calc=0;
cout<<"The Leaves:";
while(!q.empty())
{
node* Front=q.front();
q.pop();
if(!Front->left && !Front->right)
{
++calc;
cout<<Front->value<<' ';
}
if(Front->left)
q.push(Front->left);
if(Front->right)
q.push(Front->right);
}
cout<<endl<<"Ther number of leaves: "<<calc<<endl;
}
void main()
{
int Array[]={1,2,3,4,5,6,7,8,9,10,11};
int len=sizeof(Array)/sizeof(Array[0]);
Tree* T=new Tree;
for(int i=0;i<len;++i)
T->root=HorizInsert(T->root,new node(Array[i]));
HorizPrint(T->root);
}
求《数据结构》中 二叉树 的一道程序题
mystack.empty()){ tmp = mystack.top();mystack.pop();result += tmp;} cout << result << endl;return 0;} 考虑到LZ可能想要用到二叉树,于是写了以下代码,先把中缀表达式转成二叉树,再分别输出前缀和后缀。代码都是自己写的,在VC6.0下可运行。include<iostream> include<string> ...
判断完全二叉树用C语言编写
用一个线性表和一个队列,表存放的是边集,队列用于按层次遍历。程序流程如下 1 初始化空表、空队;2 输入结点数、指定根结点,输入边到表中;3 根结点进队;4 将队首出队到p;5 若表为空,返回1(真)。不空则在表中查找第一项等于p的边i。若找到,将边i的第二项进队,从表中删除边i...
完全二叉数操作(用顺序方式存储),c语言编程,一定要顺序存储!急求高人...
printf("%c\\t",data);} void preorder ( bitree *t ) \/\/前序遍历二叉树 { if ( t != NULL ){ visite (t->data);preorder ( t->lchild );preorder ( t->rchild );} } void inorder ( bitree *t )\/\/中序遍历二叉树 { if ( t != NULL ){ inorder ( t->lchild );v...
求二叉树后序遍历中的左右子树交换 C语言编程
void TreeTreaverseF(Treep T) \/\/二叉树先序遍历 { if(T){ cout<<T->Data; \/\/输出根节点值 TreeTreaverseF(T->lchild); \/\/递归调用输出左子树 TreeTreaverseF(T->rchild); \/\/递归调用输出右子树 } } void TreeTreaverseS(Treep T) \/\/中序遍历二叉树 { if(T){ Tree...
悬赏 求一道C语言的题目
从根结点开始,如果是满二叉树,则有一生二,二生四,四生八...以此类推,从而第六层结点个数是2^(6-1)=32个即最多结节点数!不知是否满意这个答案。
已知一棵二叉树的前序序列为A B D G C E H I F;中序序列为:D G B A...
二叉树的后序为G、D、B、I、H、E、F、C、A。由前前序第一个为A,所以根节点,所以A的左子树为D、G、B,右子树为E、I、H、C、F。第二个根节点为B,又由中序的出B的左子树为D、G,然后得出D的右子树为G,C为A的右子树,依次进行判断,最后的出二叉树的序列。二叉树图,如下图:...
数据结构 c语言版二叉树(1) 建立一棵含有n个结点的二叉树,采用二叉链 ...
printf("%c",ptr->ch);inorder(ptr->right_child);} } void postorder(tree_pointer ptr){ if(ptr){ postorder(ptr->left_child);postorder(ptr->right_child);printf("%c",ptr->ch);} } void main(){ printf("构建一个二叉树(结点数为n):\\n");root=create(root);printf("前序...
已知一棵二叉树的先序遍历序列为: A B C D E F G H I,中序遍历序列为...
回答:A \/ \\ B D \\ \/ \\ C E F \/ \\ G I \\ H
已知一棵二叉树的前序遍历的结果是ABECDFGHIJ, 中序遍历的结果是EBCDAF...
前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。若二叉树为空则结束返回。因此,A是根结点,B是A的左子树,F是A的右子树。E是B的左子树,C是B的右子树,...
森林的先序遍历序列,等同于对应的二叉树的()。
森林的先序遍历序列,等同于对应的二叉树的()。A.先序序列 B.中序序列 C.后序序列 D.层次序列 正确答案:A
哈澜瑞适: 楼主你好!这是我的思路:a,b)说明 根结点<左结点<右结点 c)说明这是一棵除了最后一层不满其余层全满的完全二叉树 我觉得a,b的条件可以有很多种解决方法,这里用最简单的办法.就是按每一层的从小到大排序.因此,第一步先将数组排序...
讷河市13992952034: c语言二叉树题目:一棵二叉树有10个度为1的结点,t个度为2的结点,则该二叉树有几个结点? - ?
哈澜瑞适: 任意二叉树度为0的结点(叶子节点)总比度为2的结点多一个,t个度为2的结点,则叶子节点为t+1个,加上1个根节点,总共10+2t+1,你是不是打错了,不应该是t而是7啊???竭诚为您服务,很高兴为您服务~~~~
讷河市13992952034: 用C语言写一个计算二叉树的高度 - ?
哈澜瑞适: 思想:对非空二叉树,其深度等于左子树的最大深度加1. Int Depth(BinTree *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); }
讷河市13992952034: C程序,求二叉树的树高 - ?
哈澜瑞适: #include "stdio.h" #include "malloc.h" #include "math.h" #include "string.h" #define MAX 100 void exit(int); /*--------------------*/ int count; /* 记录二叉树中的二度结点的个数 */ int flag; /* 标明二叉树是否为AVL树 *//*--------------------*/ ...
讷河市13992952034: C++二叉树的一道题目线索二叉树 - ?
哈澜瑞适: 先序线索二叉树中,某结点如果有孩子,则左孩子(如果没有就是右孩子)就是其先序后继 中序前驱和后继情况为镜像,具体请见数据结构教材 后序线索中某结点如果有右子树,则右指针域存放的是右孩子的地址,不是线索,但其后序后继却是其双亲结点,注意是二叉链表,只能从双亲往下,因此无法有效求解
讷河市13992952034: 用c语言编程实现二叉树的建立和遍历二叉树? - ?
哈澜瑞适: //这是我上数据结构写的 建议理解为主#include#include#define ERROR 0#define OK 1#define OVERFLOW -2#define FLASE 0#define TURE 1 typedef int Status; typedef char TElemType; typedef struct BiTNode{ TElemType data; struct BiTNode ...
讷河市13992952034: 请问各位高手呀,怎样用C语言编写一个关于求二叉树总数的程序和一个关于广度优先搜索的算法? - ?
哈澜瑞适: DEV C++下编译成功1.二叉树总数?(节点总数?)#include#include#include typedef struct node { char data;//节点信息struct node *lchild;//左孩子struct node *rchild;//右孩子 }BTnode; static char a[1024]; static int n=0; void create(BTnode *&...
讷河市13992952034: 用C语言编写一个程序,实现二叉树的各种基本运算,并在此基础上设计一个主程序完成如下功能: - ?
哈澜瑞适: #include <stdio.h>#include <stdlib.h> typedef struct node* link; struct node{ char item; link l,r; int counter; }; link makenode(char key) { link p = (link)malloc(sizeof(struct node)); p->item = key; p->counter = 0; p->l=p->r=NULL; return p; } link insert(link p,...
讷河市13992952034: 数据结构(C语言版)中2叉树的问题?
哈澜瑞适: #include <stdio.h> #include <malloc.h> #define MaxSize 100 #define MaxWidth 40 typedef char ElemType; typedef struct tnode {ElemType data;struct tnode *lchild,*rchild; } BTNode; void CreateBTree(BTNode * &bt,char *str) /*由str创建二叉链bt*/ ...
讷河市13992952034: 已知有一棵二叉树编写函数实现对二叉树的中序遍历输出(用c语言)急用考试!~ - ?
哈澜瑞适: 这是我以前做过的一道填空题,你可以参考一下.void preorder1(Bnode *root) {/* 前序遍历二叉树*/ if (root) {printf("%c",root->data); if(root->lchild) preorder1(root->lchild); if( root->rchild) preorder1(root->rchild); } } /* preorder */ void preorder2(...