在用二叉链表表示的有n个结点的二叉树中,值为非空的链域的个数为多少?答案是n-1,这个是为什么啊,

6312632022-10-04 11:39:541条回答

已提交,审核后显示!提交回复

共1条回复
洋葱001 共回答了20个问题 | 采纳率95%
n个节点则有2n个链域,除了根节点没有被lchild和rchild指向,其余的节点必然会被指到.所以空链域公有2n-(n-1)=n+1;
非空链域有2n-(n+1)=n-1;
1年前

相关推荐

数据结构问题,急3. 给定一棵以二叉链表形式存储的二叉树,root指向其根。请编写算法求二叉树的高度。 4. 给定一棵以
数据结构问题,急
3. 给定一棵以二叉链表形式存储的二叉树,root指向其根。请编写算法求二叉树的高度。
4. 给定一棵以二叉链表形式存储的二叉树,root指向其根。请编写算法求出二叉树中值为x的结点的数目。
5. 已知下图所示的二叉树是由某森林转换而来的。请给出原森林。

6. 假定有八个字符,它们出现的概率分别为:0.07、0.09、0.14、0.19、0.23、0.44、0.58和0.77。
(1)请给出这8个字符的哈夫曼树和哈夫曼编码;
(2)编码树的WPL的实际意义是什么?
第六章
1. 对于如下图所示的有向图,请给出
(1) 各顶点的入度和出度
(2) 强连通分量和弱连通分量
(3) 邻接矩阵
(4) 邻接表和逆邻接表

2. 假设有向图存储为邻接矩阵,请编写一个算法,求出指定顶点的入度和出度。
3. 对于如下图所示的无向图,分别画出其深度优先搜索和广度优先搜索生成的树。

4. 对下面的无向带权图应用求最短路经的Floyd算法,求出每对顶点之间的最短路径,并写出在算法的执行过程中所求得的各个矩阵。

5. 对如下图所示的无向带权图,按照Kruskal算法求出最小生成树,并画出每一步所得到的中间结果。

第七章
1. 试比较顺序查找算法和二分查找算法的特点、优缺点。
2. 请编写一个递归的二分查找算法。
3. 从一棵空的查找树开始,依次插入键值71,32,103,66,135,82,57,91,画出每次插入后所得到的查找树,再依次删除57、82、71,画出每次删除后所得到的查找树,并对最终得到的查找树求出等概率情况下的平均成功查找长度。
4. 请编写一个判断二叉树T是否为查找树的算法,假定二叉树T是以标准形式存贮的。
5. 从一个空的散列表开始,依次为插入关键字Jan、Feb、Mar、Apr、May、Jun、Jul、Aug、Sep、Oct、Nov、Dec,散列函数为 为关键字key第一个字母的序号,如 散列表长度为17。分别使用
(1) 线性探测法
(2) 链地址法
建立散列表。请分别画出散列表,并求出等概率情况下的平均成功查找长度。
第八章
1. 分别用下列排序算法对关键字序列(49,7,50,5,94,16,90,29,71)进行排序,写出每一趟排序所得到的中间结果。
(1) 直接插入排序
(2) 希尔排序
(3) 改进的冒泡排序
(4) 快速排序
(5) 直接选择排序
(6) 堆排序
(7) 合并排序
2. 一种冒泡排序算法是所谓“上浮式的”,即每趟排序都把较小的关键字“浮”到上面(数组下标较小的那一边)去。请编写一个改进的“下沉式的”冒泡排序算法。
3. 举例说明直接选择排序算法、快速排序算法和堆排序算法不是稳定的。
laopifu1年前1
gezi61 共回答了12个问题 | 采纳率83.3%
亲 我认为你没给分的话 应该没人为你回答的 虽然说我不会 但是你问这么多题不给分真的是有一点点点点点 好吧 很抠
设二叉树的存储结构为二叉链表,编写有关二叉树的递归算法:
设二叉树的存储结构为二叉链表,编写有关二叉树的递归算法:
(1)统计二叉树中度为1的结点个数。
(2)统计二叉树中度为2的结点个数。
(3)统计二叉树中度为0(叶结点)的结点个数。
(4)统计二叉树的高度。
(5)统计二叉树的宽度,即在二叉树的各层上,具有结点数最多的那一层上的结点总数。
(6)从二叉树中删去所有叶节点。
(7)计算二叉树中指定结点*p所在层次。
(8)计算二叉树中各结点中的最大元素的值。
(9)交换二叉树中每个结点的两个子女。
(10)以前序次序输出一棵二叉树所有结点的数据值及结点所在层次。
请编完整的程序分别实现以上算法
同等懒人1年前1
tangq1110 共回答了17个问题 | 采纳率100%
给了一个程序给你参考,有前中后序遍历,实现了前5个功能。
提示:8功能可以用任意一种遍历方法,在程序中,将打印字符的部分换成自己的判断程序即可。
6功能用后续遍历,当遍历到任意一节点时,判断其孩子是不是叶子,是就删除。
7功能参考求广度的实现】
9功能参考6功能,用前序遍历也可以
10功能也参考求广度的方法
程序:
#include
#include
#include
#include
#define NUM_NODE 12
#define MOST_DEPTH 10
typedef struct BiTree{
int data;
BiTree *lchild;
BiTree *rchild;
}BiTree;
typedef struct Answear{
int Degree0;
int Degree1;
int Degree2;
int Depth;
} Answear;
BiTree* CreateTree(int n)
{
BiTree *t;
if (n NUM_NODE) return NULL;
if (!(t = (BiTree*)malloc(sizeof(BiTree))))
return NULL;
t->data = n;
printf("%d ", t->data);
t->lchild = CreateTree(2*n);
t->rchild = CreateTree(2*n+1);
return t;
}
void FreeTree(BiTree *t)
{
if (t)
{
if (t->lchild)
FreeTree(t->lchild);
if (t->rchild)
FreeTree(t->rchild);
printf("%d ", t->data);
free(t);
}
}
//中序遍历
void InOrder(BiTree *t)
{
BiTree **stack, **top, *p;
//创建堆栈
if (!(stack = (BiTree**)malloc(NUM_NODE * sizeof(BiTree))))
{
printf("InOrder failed for memeryn");
return;
}
//初始化堆栈
top = stack;
p = t;
while (p || top>stack)//p不为NULL,堆栈不空
if (p)
{
*top++ = p;//p入堆栈
p = p->lchild;
}
else
{
p = *--top;//p出栈
if (p) printf("%d ", p->data);
p = p->rchild;
}
}
//前序遍历
void PreOrder(BiTree *t)
{
BiTree **stack, **top, *p;
if (!(stack = (BiTree**)malloc(NUM_NODE * sizeof(BiTree))))
{
printf("InOrder failed for memeryn");
return;
}
top = stack;
p = t;
while (p || top>stack)
if (p)
{
*top++ = p;
if (p) printf("%d ", p->data);
p = p->lchild;
}
else
{
p = *--top;
p = p->rchild;
}
}
//后序遍历
void PostOrder(BiTree *t)
{
BiTree **stack, **top, *p, *p_old, *p_new;
int Flag;
if (!(stack = (BiTree**)malloc(NUM_NODE * sizeof(BiTree))))
{
printf("InOrder failed for memeryn");
return;
}
top = stack;
Flag = 0;
*top++ = t;
while (top > stack)
{
p = *(top-1);
if (p->lchild && !Flag)
*top++ = p->lchild;
else
{
if (p->rchild)
{
*top++ = p->rchild;
Flag = 0;
}
else
{
p_old = *--top;
printf("%d ", p_old->data);
while (top > stack)
{
p_new = *(top-1);
if (p_old == p_new->lchild)
{
Flag = 1;
break;
}
else
{
p_new = *--top;
printf("%d ", p_new->data);
p_old = p_new;
Flag = 0;
}
}
}
}
}
}
//中序遍历求结点的深度和度为0,1,2的结点数,结果保存在pAns指的。。。
void InOrderDO(BiTree *t , Answear * pAns)
{
//遍历用的数据
BiTree **stack, **top, *p;
//求深度的数据
int curDeep, MostDeep;
//创建堆栈
if (!(stack = (BiTree**)malloc(NUM_NODE * sizeof(BiTree))))
{
printf("InOrder failed for memeryn");
return;
}
//初始化堆栈
top = stack;
p = t;
//初始化数据
curDeep = MostDeep = 0;
pAns->Degree0 = pAns->Degree1 = pAns->Degree2 = 0;
//遍历循环
while (p || top>stack)//p不为NULL,堆栈不空
if (p)
{
*top++ = p;//p入堆栈
p = p->lchild;
curDeep++;
if (MostDeep < curDeep) MostDeep = curDeep; //保存最深度
}
else
{
p = *--top;//p出栈
curDeep--;
//if (p) printf("%d ", p->data); //Visit结点
//计算个结点的度
if (p->lchild && p->rchild) pAns->Degree2++;
else if (p->lchild || p->rchild) pAns->Degree1++;
else pAns->Degree0++;
p = p->rchild;
}
//得到深度
pAns->Depth = MostDeep;
return ;
}
//前序递归求广度
void Pre(BiTree *T, int* woed, int depth)
{
woed[depth]++;
if (T->lchild) Pre(T->lchild, woed, depth+1);
if (T->rchild) Pre(T->rchild, woed, depth+1);
}
//求广度的程序,返回值为广度
int GetTreeWidth(BiTree *root)
{
int i, WidthOfEachDepth[MOST_DEPTH]={0};
Pre(root, WidthOfEachDepth, 0);
for (i=1; i
二叉排序树问题,课程设计采用顺序存储方式或二叉链表存储方式保存二叉排序树
二叉排序树问题,课程设计采用顺序存储方式或二叉链表存储方式保存二叉排序树
(1)给出n个数,并由这n个数创建一棵二叉排序树。
(2)在二叉排序树中查找值为e的节点。
(3)给出一个新的数x,将其加入到二叉排序树。
要求:由一个主函数提供统一的处理接口,并分析各算法的时间复杂度
linyunhot1年前1
蒙神 共回答了14个问题 | 采纳率100%
#include
#include
typedef struct node
{
int data;
node *left;
node *right;
}node;
node* CreateTree(node *root,int n)
{
if(root==NULL)
{
root=(node *)malloc(sizeof(node));
root->data=n;
root->left=NULL;
root->right=NULL;
return root;
}
else if(n>root->data)
{
root->right=CreateTree(root->right,n);
return root;
}
else if(ndata)
{
root->left=CreateTree(root->left,n);
return root;
}

}
void Print(node *root)
{
if(root!=NULL)
{
Print(root->left);
printf("%d ",root->data);
Print(root->right);
}
return;
}
bool search(node* root,int a)
{
node *p=root;
while(p!=NULL)
{
if(a==p->data)
return true;
else if(a>p->data)
p=p->right;
else if(adata)
p=p->left;
}
return false;
}
void del(char *c)
{
int i,j=0,k=0;
bool b=true;
for(i=0;c[i]!=' ';++i)
{
b=true;
k=0;
while(k
1.设某棵二叉树中度数为0的结点数为N0,度数为1的结点数为N1,若采用二叉链表作为该二叉树的存储结构,则该二叉树中共有
1.设某棵二叉树中度数为0的结点数为N0,度数为1的结点数为N1,若采用二叉链表作为该二叉树的存储结构,则该二叉树中共有()个空指针域.
A N0+N1
B N0+1
C 2N0+N1
D N0-1
2.下面选项中关于哈希表的查找的说法正确的有()
A 如果计算的某个散列地址为空,则查找失败
B 如果计算的某个散列地址非空,代表查找成功
C 必须通过哈希函数计算哈希地址
D 哈希表的查找无需进行关键字的比较
柯德1年前1
爱不到就抢 共回答了19个问题 | 采纳率89.5%
最佳的方案是换整机,换CPU没意义478平台已经作古增加投入不值得,所带来的提升回报太小,如果短期内还没有升级平台的计划,建议入二手8600GT或3650PRO AGP版,主流游戏低效果可以坚持一段时间.
能用二分法进行查找的是A 顺序存储的有序线性表B 线性链表C 二叉链表D 有序线性链表
aiwenyue1年前1
taishl 共回答了16个问题 | 采纳率100%
正确的是:A
链表是不能采用二分查找的,因为链表不具备随机访问特性.
二分查找的必要条件是:
线性表,有序;
数据结构的几个问题 求大神1. 如果具有n个结点的非空二叉树采用二叉链表存储结构,该链表一共有 个指针域,其中有 个指针
数据结构的几个问题 求大神
1. 如果具有n个结点的非空二叉树采用二叉链表存储结构,该链表一共有 个指针域,其中有 个指针域存放非空指针,有 个指针存放空指针(nil)。
2. 高度为K(K>=1)的二叉树至多有 个结点。
3. 如果要求一个线性表既能够较快速的查找,又能适应动态变化的要求,则可采用 的结构。
zxl811021年前1
广州小玉 共回答了14个问题 | 采纳率100%
1. 2n n-1 n+1
2. 2的k次方-1
3. 链表
二叉树的基本操作用递归的方法实现以下算法:1.以二叉链表表示二叉树,建立一棵二叉树;2.输出二叉树的前序遍历结果;3.输
二叉树的基本操作
用递归的方法实现以下算法:
1.以二叉链表表示二叉树,建立一棵二叉树;
2.输出二叉树的前序遍历结果;
3.输出二叉树的中序遍历结果;
4.输出二叉树的后序遍历结果;
5.统计二叉树的叶结点个数;
6.统计二叉树的结点个数;
7.计算二叉树的深度。
8.交换二叉树每个结点的左孩子和右孩子;
昌江紫贝壳1年前1
kicc77 共回答了16个问题 | 采纳率81.3%
http://www.***.net/Article/kfyy/sjjg/200706/4585.html
所有二叉树的操作实现,你要的都有
建立二叉树的二叉链表表示,实现二叉树的先序、中序、后序和按层次遍历,统计并输出结点个数。
建立二叉树的二叉链表表示,实现二叉树的先序、中序、后序和按层次遍历,统计并输出结点个数。
1)采用二叉链表存储结构建立二叉树,从键盘按先序输入二叉树的结点序列。如,建立如右图所示的二叉树,建立时按先序输入的结点序列为: abc###de#f##g##,其中“#”表示空格字符,用来代表空树。
(2)二叉树的建立、先序遍历、中序遍历、后序遍历均采用递归方式实现。
(3)层序遍历采用非递归方式实现。
(4)利用后序遍历算法统计结点个数。
fhgyjyu1221年前1
海边的阿迪丽娜 共回答了14个问题 | 采纳率85.7%
typedef struct node
{
char data;
struct node *lchild,*rchild;
}bitree;
bitree *root=NULL;
//创建树
bitree *CreateTree(char *sInPut)
{
bitree *root,*s;
bitree *Q[128];
int front,rear;
root=NULL;
front=1;
rear=0;
char temp[128],*p;
memset(temp,0,128);
strcpy(temp,sInPut);
p=temp;
while(strlen(p)>0)
{
s=NULL;
if(*p!='@')
{
s=(bitree*)malloc(sizeof(bitree));
s->data=*p;
s->lchild=NULL;
s->rchild=NULL;
}
rear++;
Q[rear]=s;
if(rear==1)
{
root=s;
}
else
{
if(s && Q[front])
{
if(rear%2==0)
Q[front]->lchild=s;
else
Q[front]->rchild=s;
}
if(rear%2==1) front++;
}
p+=2;
}
return root;
}
//释放树
void freetree(bitree *root)
{
if(root!=NULL)
{
freetree(root->lchild);
freetree(root->rchild);
free(root);
}
}
//前序遍历
void preorder(bitree *root)
{
if(root!=NULL)
{
printf("%ct",root->data);
preorder(root->lchild,sOutPut);
preorder(root->rchild,sOutPut);
}
}
//中序遍历
void inorder(bitree *root)
{
if(root!=NULL)
{
inorder(root->lchild,sOutPut);
printf("%ct",root->data);
inorder(root->rchild,sOutPut);
}
}
//后序遍历
void postorder(bitree *root)
{
if(root!=NULL)
{
postorder(root->lchild,sOutPut);
postorder(root->rchild,sOutPut);
printf("%ct",root->data);
}
}
//层次遍历
void PrintTree(bitree *root)
{
CString sOutPut;
char temp[128];
bitree *Q[128],*s;
int front,rear;
front=0;
rear=0;
sOutPut.Empty();
Q[rear++]=root;
while(rear>front)
{
printf("%ct",Q[front]->data);
sOutPut=temp;
s=Q[front++];
if(s->lchild!=NULL)
Q[rear++]=s->lchild;
if(s->rchild!=NULL)
Q[rear++]=s->rchild;
}
}
//树叶子数
void countleaf(bitree *root,int &count)
{ if(root!=NULL)
{ if((root->lchild==NULL)&&(root->rchild==NULL))
{ count++;
return;
}
countleaf(root->lchild,count);
countleaf(root->rchild,count);
}
}
//树深度
void treedepth(bitree *root,int l,int &h)
{ if(root!=NULL)
{ l=l+1;
if(l>h) h=l;
treedepth(root->lchild,l,h);
treedepth(root->rchild,l,h);
}
}
给定一颗用二叉链表表示的二叉树,其根指针为 root。
给定一颗用二叉链表表示的二叉树,其根指针为 root。
试写出求二叉树结点的数目的算法(递归算法或非递归算)
bsm9031年前1
wyyzz385 共回答了19个问题 | 采纳率89.5%
int getTotalNum(TreeNode *root)
{
if(root == NULL)
return 0;
else
return 1 + getTotalNum(root->left) + getTotalNum(root->right);
}
数据结构的线索二叉树,为什么在有n个结点的二叉链表中必定存在n+1个空链域
翻遭aa噬1年前1
湖口佳佳 共回答了27个问题 | 采纳率85.2%
n个结点的二叉链表中必定存在n+1个空链域
因为n个结点的二叉链表中有2n个孩子指针,而n个结点除根结点外,均有一个指针指向它,所以2n-(n-1)=n+1个指针是空的
二叉排序树。用二叉链表作存储结构。(8
二叉排序树。用二叉链表作存储结构。(8
要求:
(1)以回车('n')为输入结束标志,输入数列L,生成一棵二叉排序树T;
(2)对二叉排序树T作中序遍历,输出结果;
(3)计算二叉排序树T查找成功的平均查找长度,输出结果;
(4)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。
fiyour1年前1
saly8 共回答了19个问题 | 采纳率89.5%
这是我前几天写的,看了下应该可以满足要求,由于测试还不够,不知道有没有bug。
第一点你自己改改,2、3都达到了,至于第四,不用说肯定是平衡了的二叉树相对查找效率要高一些,平衡,随机插入,打乱插入等操作都是为了防止最差情况的线性树的出现。测试的话用rand()生成随机数外加time.h里的几个函数,配合使用下就出来了。
#include
#include
// binary search tree
typedef struct BST
{
int data;
struct BST* lhs;
struct BST* rhs;
}BST;
// 插入一个节点
BST* BSTInsertNode(BST* root, int elem)
{
BST* node;
node = (BST*)malloc(sizeof(BST));
node->data = elem;
node->lhs = node->rhs = 0;

if(!root)
return node;

while(1)
{
if(node->data < root->data)
{
if(root->lhs)
root = root->lhs;
else
{
root->lhs = node;
return root->lhs;
}
}
else
{
if(root->rhs)
root = root->rhs;
else
{
root->rhs = node;
return root->rhs;
}
}
}
}
// 获得父节点
BST* BSTGetParentNode(BST* root, BST* node)
{
if(root == node)
return 0;

if(root->lhs && node->data < root->lhs->data)
return BSTGetParentNode(root->lhs, node);
else if(root->rhs && node->data > root->rhs->data)
return BSTGetParentNode(root->rhs, node);
else
return root;
}
// 删除一个节点
BST* BSTDeleteNode(BST* root, BST* node)
{
BST* parent;
BST** whichNode;
BST* temp;

if(root != node)
{

parent = BSTGetParentNode(root, node);
whichNode = parent->lhs == node ? &parent->lhs : &parent->rhs;
}
else
whichNode = &root;
if(!node->lhs && !node->rhs)
*whichNode = 0;
else if(!((node->lhs ? 1 : 0) ^ (node->rhs ? 1 : 0)))
*whichNode = node->lhs ? node->lhs : node->rhs;
else
{
temp = node->rhs;
while(temp->lhs)
temp = temp->lhs;
temp->lhs = node->lhs;
*whichNode = node->rhs;
}
free(node);
return *whichNode;
}
// 删除树
void BSTDeleteTree(BST* node)
{
if(node)
{
BSTDeleteTree(node->lhs);
BSTDeleteTree(node->rhs);
free(node);
}
}
// 建造树,从数组构造
BST* BSTBuildTree(int* beg, int* end)
{
BST* root;

if(beg >= end)
return 0;

root = (BST*)malloc(sizeof(BST));
root->data = *beg++;
root->lhs = root->rhs = 0;

while(beg != end)
BSTInsertNode(root, *beg++);

return root;
}
// 查找节点
BST* BSTSearchNode(BST* root, int elem)
{
if(root)
{
if(elem < root->data)
return BSTSearchNode(root->lhs, elem);
else if(elem > root->data)
return BSTSearchNode(root->rhs, elem);
else
return root;
}
else
return 0;
}
// 获得最小值
BST* BSTGetMinimumNode(BST* root)
{
while(root->lhs)
root = root->lhs;
return root;
}
// 获得最大值
BST* BSTGetMaximumNode(BST* root)
{
while(root->rhs)
root = root->rhs;
return root;
}
// 前序遍历
void BSTPreorderTraverse(BST* node)
{
if(node)
{
printf("%d ", node->data);
BSTPreorderTraverse(node->lhs);
BSTPreorderTraverse(node->rhs);
}
}
// 中序遍历
void BSTInorderTraverse(BST* node)
{
if(node)
{
BSTInorderTraverse(node->lhs);
printf("%d ", node->data);
BSTInorderTraverse(node->rhs);
}
}
// 后序遍历
void BSTPostorderTraverse(BST* node)
{
if(node)
{
BSTPostorderTraverse(node->lhs);
BSTPostorderTraverse(node->rhs);
printf("%d ", node->data);
}
}
// 获得前继值
BST* BSTGetPredecessor(BST* root, BST* node)
{
BST* predecessor;
BST* rightCld;

if(node->lhs)
return BSTGetMaximumNode(node->lhs);

predecessor = rightCld = node;
while((predecessor = BSTGetParentNode(root, predecessor)))
if(predecessor->rhs == rightCld)
return predecessor;
else
rightCld = predecessor;
return 0;
}
// 获得后继值
BST* BSTGetSuccessor(BST* root, BST* node)
{
BST* successor;
BST* leftCld;

if(node->rhs)
return BSTGetMinimumNode(node->rhs);

successor = leftCld = node;
while((successor = BSTGetParentNode(root, successor)))
if(successor->lhs == leftCld)
return successor;
else
leftCld = successor;
return 0;
}
// 获得树高
int BSTGetTreeHeight(BST* root)
{
int l;
int r;
if(root)
{
l = BSTGetTreeHeight(root->lhs);
r = BSTGetTreeHeight(root->rhs);
return 1 + (l > r ? l : r);
}
else
return -1;
}
// 计算子节点数
int BSTGetSubtreeNodeNum(BST* node)
{
if(node)
return BSTGetSubtreeNodeNum(node->lhs)
+ BSTGetSubtreeNodeNum(node->rhs)
+ 1;
else
return 0;
}
// 用于打乱数组,交换
inline void Swap(int* a, int* b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
// 用于打乱数组,qsort的比较用过程
inline int CMP(const void* lhs, const void* rhs)
{
return *(const int*)lhs - *(const int*)rhs;
}
// 数组有序?
int IsOrdered(int* beg, int* end)
{
int attri;
int cmpVal;
if(beg >= end)
return 0;
if(end - beg <= 2)
return 1;

if(*beg < *(beg + 1))
attri = 1;
else
attri = 0;

cmpVal = *beg++;
while(++beg != end)
{
if(attri)
{
if(cmpVal > *beg)
return 0;
}else
{
if(cmpVal < *beg)
return 0;
}
}
return 1;
}
// 高层次打乱数组
void HighlyUnorderArray(int* beg, int* end)
{

int* mid = beg + (end - beg)/2;
int* folk;
if(!IsOrdered(beg, end))
qsort(beg, end - beg, sizeof(int), CMP);

if((mid - beg) & 1)
Swap(beg++, mid);
folk = beg + 2;
while(folk < mid)
{
Swap(beg++, folk++);
Swap(beg++, folk++);
}

folk = mid + 2;
while(folk < end)
{
Swap(folk, folk - 1);
folk += 2;
}
}
// 中序遍历结果输出到数组
void BSTInorderWalkToArray(BST* root, int** p)
{
if(root)
{
BSTInorderWalkToArray(root->lhs, p);
**p = root->data;
(*p)++;
BSTInorderWalkToArray(root->rhs, p);
}
}
// 平衡树,返回平衡好的新树
BST* BSTBalanceTree(BST* root)
{
int size = BSTGetSubtreeNodeNum(root);
int* a = (int*)malloc(sizeof(int) * size);
int* end = a;
BST* balancedTree;

BSTInorderWalkToArray(root, &end);
HighlyUnorderArray(a, end);
balancedTree = BSTBuildTree(a, end);
free(a);
return balancedTree;
}
int main()
{
int a[] = ;
int c[] = ;
BST* bstTree = BSTBuildTree(a, a + sizeof(a)/sizeof(a[0]));

BSTPreorderTraverse(bstTree);
putchar('n');
BSTInorderTraverse(bstTree);
putchar('n');
BSTPostorderTraverse(bstTree);
printf("nn");

BST* balancedTree = BSTBalanceTree(bstTree);
printf("%d %dn", BSTGetTreeHeight(bstTree), BSTGetTreeHeight(balancedTree));
BSTDeleteTree(bstTree);
BSTDeleteTree(balancedTree);
}
有关二叉树递归的算法设二叉树的存储结构为二叉链表,编写有关二叉树的递归算法:(1)从二叉树中删去所有叶节点。(2)计算二
有关二叉树递归的算法
设二叉树的存储结构为二叉链表,编写有关二叉树的递归算法:
(1)从二叉树中删去所有叶节点。
(2)计算二叉树中指定结点*p所在层次。
(3)计算二叉树中各结点中的最大元素的值。
(4)交换二叉树中每个结点的两个子女。
(5)以前序次序输出一棵二叉树所有结点的数据值及结点所在层次。
请编完整的程序分别实现以上算法
kingleesl1年前1
xihuanxiaos 共回答了20个问题 | 采纳率100%
靠,缩进全被百度搞乱了,自己排版

  #include
using namespace std;
  //二叉树节点
struct BiTreeNode{
int data;
BiTreeNode *left;
BiTreeNode *right;
};
  //写一个类,方便二叉树的建立和删除
class BiTree{
private:
void deleteAllNode(BiTreeNode *root);
public:
BiTreeNode *root;
BiTree();
~BiTree();
void CreateTree();
void deleteLeaves(BiTreeNode *root);
bool DepthOfTheNode(BiTreeNode *currentNode,BiTreeNode *p, int depthOfFather);
void FindMaxValue(BiTreeNode *currentNode, int *maxValue);
void ExchangeLeftAndRight(BiTreeNode *currentNode);
void OutputValueAndDepthByQIANXU(BiTreeNode *currentNode, int depthOfFather); //不好意思,用了拼音
};
BiTree::BiTree()
{
root = NULL;
}
BiTree::~BiTree()
{
deleteAllNode(root);
}
void BiTree::deleteAllNode(BiTreeNode *root)
{
if (root == NULL) return;
deleteAllNode(root->left);
deleteAllNode(root->right);
cout data data = 1;
root->left = new BiTreeNode;
root->left->data = 2;
root->right = new BiTreeNode;
root->right->data = 3;
  BiTreeNode *p;
p = root->left;
p->left = NULL;
p->right = new BiTreeNode;
p->right->data = 4;
p->right->left = p->right->right = NULL;
  p= root->right;
p->left = new BiTreeNode;
p->left->data = 5;
p->left->left = p->left->right = NULL;
  p->right = NULL;
}
  //用递归算法删除叶子
void BiTree::deleteLeaves(BiTreeNode *root)
{
if (root == NULL) return;
if (!root->left && !root->right) return; //表示是根节点(或者出错,跑到叶子节点了,这种情况应该不会),不删除
if (root->left) //当前节点有左子树
{
if (root->left->left || root->left->right) //左子树不是叶子
deleteLeaves(root->left);
else //当前节点的左子节点是叶子
{
delete root->left;
root->left = NULL;
}
}
if (root->right)
{
if (root->right->left || root->right->right)
deleteLeaves(root->right);
else //当前节点的右子节点是叶子
{
delete root->right;
root->right = NULL;
}
}
}
  int depth = 0; //一个用来存储深度的全局变量,虽然在实际编程中这样用不好
//但一切为了方便。
//节点p的深度,递归法
bool BiTree::DepthOfTheNode(BiTreeNode *currentNode,BiTreeNode *p, int depthOfFather)
{
if (currentNode == NULL) return false;
if (currentNode == p) //当前节点为要找的节点
{
depth = depthOfFather + 1;
return true;;
}
if (DepthOfTheNode(currentNode->left, p, depthOfFather+1)) //找当前节点的左子树
return true;
else
return DepthOfTheNode(currentNode->right, p, depthOfFather+1);
}
  //用递归找最大值,最大值存储在maxValue所指的内存 ,这里使用前序遍历
void BiTree::FindMaxValue(BiTreeNode *currentNode, int *maxValue)
{
if (currentNode == NULL) return;
*maxValue = *maxValue > currentNode->data ? *maxValue : currentNode->data;
FindMaxValue(currentNode->left, maxValue); //遍历左子树
FindMaxValue(currentNode->right, maxValue);
}
  //交换左右,用前序遍历
void BiTree::ExchangeLeftAndRight(BiTreeNode *currentNode)
{
if (currentNode == NULL) return;
BiTreeNode *temp;
temp = currentNode->left;
currentNode->left = currentNode->right;
currentNode->right = temp;
  ExchangeLeftAndRight(currentNode->left);
ExchangeLeftAndRight(currentNode->right);
}
  //以前序次序输出一棵二叉树所有结点的数据值及结点所在层次
void BiTree::OutputValueAndDepthByQIANXU(BiTreeNode *currentNode, int depthOfFather)
{
if (currentNode == NULL) return;
cout right, 0);
cout
二叉树的遍历对任意给定的二叉树(顶点数自定)建立它的二叉链表存贮结构,并利用栈的五种基本运算(置空栈、进栈、出栈、取栈顶
二叉树的遍历
对任意给定的二叉树(顶点数自定)建立它的二叉链表存贮结构,并利用栈的五种基本运算(置空栈、进栈、出栈、取栈顶元素、判栈空)实现二叉树的先序、中序、后序三种遍历,输出三种遍历的结果。
54魚1年前1
gemtin 共回答了15个问题 | 采纳率86.7%
昨天U盘上还在。。。。。。。擦,刚删除,三种都编好的
数据结构 已知一棵二叉树以二叉链表作为储存结构拜托各位大神
数据结构 已知一棵二叉树以二叉链表作为储存结构拜托各位大神
已知一棵二叉树以二叉链表作为储存结构,编写完成下列操作的算法:对于树中每一个元素值为x的结点。删去以它为根的子树,并释放相应的空间。
白鸽的梦1年前1
zhangdke 共回答了17个问题 | 采纳率94.1%
您好,看到您的问题一直是零回答问题且将要被新提的问题从问题列表中挤出,问题无人回答过期后会被扣分并且悬赏分也将被没收!所以我给你提几条建议: 一,您可以选择在正确的分类下去提问或者到与您问题相关专业网站论坛里去看看,这样知道你问题答案的人才会多一些,回答的人也会多些。当然,找老师帮忙是最简单有效的方法! 二,您可以多认识一些知识丰富的网友,和曾经为你解答过问题的网友经常保持联系,遇到问题时可以直接向这些好友询问,他们会更加真诚热心为你寻找答案的。 三,很多时候该自己做的事还是必须有自己独立完成的,有的事还是须由自己的聪明才智来解决的,别人不可能代劳!就算别人给你代劳,最后也不属于你的,只有自己做了才是真正属于自己的,别人只能给你提供指导和建议,最终靠自己。所以,祝愿你可以凭借自己的努力找到最终自己想要的结果!你是最棒的! 您可以不采纳我的答案,但请你一定采纳我的建议哦! 虽然我的答案很可能不能解决你的问题,但一定可以使你更好地使用问问哦~~~
希望采纳
数据结构算法设计题1.已知一颗二叉树采用二叉链表存放,写一算法,要求统计出二叉树中叶子结点个数并输出(输出无顺序要求)1
数据结构算法设计题
1.已知一颗二叉树采用二叉链表存放,写一算法,要求统计出二叉树中叶子结点个数并输出(输出无顺序要求)
1.已知一个带头结点的整数单链表L,要求将其拆分为一个正整数单链表L1和一个负整数单链表L2.
2.无向图采用邻接表存储结构,编写算法输出图中各连通分量的节点序列
3.编写一个建立二叉树的算法,要求采用二叉链表存储结构
2.编写算法,判断带头结点的双循环链表L是否对称.
急需啊,考试要用的.
我知道有点麻烦啦,答案好的话我加分的
Yama_xx1年前1
500error 共回答了14个问题 | 采纳率100%
某链表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用( )存储方式最节省运算时间.(A)...已知带头结点的单链表L中的结点是按整数值递增排列的,试写一算法,将值为x 的结点插入到表L中,使得L仍然有序