c语言二叉树问题,勿写代码,求详细思考过程

2024-05-17 01:56

1. c语言二叉树问题,勿写代码,求详细思考过程

后序遍历:若树不空,则先依次后根遍历各棵子树,然后访问根结点。(先左后右)
中序遍历:若树不空,则先访问左子树,再访问根,再访问右子树。
从后序遍历:CDABE得出E是最顶根节点。
然后中序遍历:CADEB得出CAD是E的左子树中的,B是E的右子树中的。
再分析后序遍历CDA可以知道A是CD的根,
而中序是CAD得到C是A的左子树,D是A的右子树。(如下图)
最后,先序遍历:若树不空,则先访问根结点,然后依次先根遍历各棵子树。
于是得到结束: 先序遍历是 EACDB
 
 
 
 

c语言二叉树问题,勿写代码,求详细思考过程

2. C语言,二叉树的问题

性质:对任何一棵二叉树,度为0的结点(即叶子结点)总是比度为2的结点多一个
所以问题1中,总结点:N = 70 + 80 + 69 = 219

问题2:
深度为9的满二叉树,结点合是:511
深度为8的满二叉树,结点合是:255
由上知要求的这棵树,深度为9,但最后一层不满,
则最后一层的叶子结点数为:500-255=245
则倒数第二层的叶子结点数为:128-123=5
则此树总共叶子结点数为:245+5=250个

3. c语言二叉树的问题

你应该知道的一点是
C语言中其实没有传址一说,只有传值
传指针也只是把指针的值传过去,并非传址
所以为了构建左右子树,需要改变左右子树指针实际的值,而为了改变实际的值
得传递这个指针的地址,这样才能改掉这个指针的值
否则直接传递指针,仅传递了这个指针的值,没法改掉指针本身
而为了传递指针的地址,就得是定义成指向指针的指针了
不过有一个建树的版本是利用返回值,就没用到二级指针
node*build(int num){    if(num)    {        node*p=(node*)malloc(sizeof(node));        p->l=build(num>>1);        scanf("%d",&p->data);        p->r=build(num-(num>>1)-1);        return p;    }    else return 0;}int main(){    node*root=build(10);//建10个节点的树}

c语言二叉树的问题

4. c语言二叉树结点

二叉树的重要性质:在任何二叉树中,叶子结点数总比度为2的结点多1。
证明:设n0为二叉树的叶结点数;n1为二叉树中度为1的结点数;n2为二叉树中度为2的结点数,显然n=n0+n1+n2 (1) 
由于二叉树中除了根结点外,其余每个结点都有且仅有一个前件。设 b为二叉树的前件个数,n=b+1(2) 
所有这些前件同时又为度为1和度为2的结点的后件。因此又有b=n1+2n2 (3) 
我们将(3)代入(2)得出n=n1+2n2+1 (4) 
比较(1)和(4),得出n0=n2+1,即叶子数比度为2的结点数多1 

这是定理哦

5. c语言,二叉树求解~

先考虑度为2的结点,第一层1个,第二层2个,第三层4个,第四层8个,第五层8个,共23个。
然后第5层还有8个空位,先假设为叶子节点,即度为0。第五层满,目前总共31个结点。
然后第五层的8个度为2的结点可以引申出16个叶子结点,总共47个,以满足题意,假设成立。
故6层。
当然比较简单的题画图会很好解。

c语言,二叉树求解~

6. 二叉树(C语言)

这个问题,可以看成完全二叉树,有性质有节点i的父节点为: i/2.
而题目要求的意思也就是找到两个节点的公共父节点。(含可能为其中一个节点)
因此,思路如下:
输入两个值 x,y
找到较大的那个,(循环的,因不断改变,所以需不断比较)
做x=x/2;(假设此时x较大,x为int 型)
然后再比较,,如此反复。
当x==y时,结束,即为输出值。

(因马上断电,不给代码了,思路就是这样。。。)

7. 关于二叉树的一道C编程题,请各位高手帮忙写个完整代码。

楼主你好!
这是我的思路:
a,b)说明 根结点<左结点<右结点
c)说明这是一棵除了最后一层不满其余层全满的完全二叉树
我觉得a,b的条件可以有很多种解决方法,这里用最简单的办法.就是按每一层的从小到大排序.
因此,第一步先将数组排序(快速排序,插入排序.....任何一种) nlgn内搞定.
第二步,就是完全二叉树的插入法.完全二叉树插入法可以用水平遍历的办法的扩展,这里不细说.
第三步,统计叶子节点值和输出叶子节点值(这个太简单,只需要输出left和right都为空的结点即可.)
完整代码:
排序步骤忽略.
#include#includeusing 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 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 q;	q.push(root);	int calc=0;	coutleft && !Front->right)		{			++calc;			coutvalueleft)			q.push(Front->left);		if(Front->right)			q.push(Front->right);	}	coutroot=HorizInsert(T->root,new node(Array[i]));	HorizPrint(T->root);}	

关于二叉树的一道C编程题,请各位高手帮忙写个完整代码。

8. C语言二叉树问题?








敲码不易,望采纳!