1. c语言二叉树问题,勿写代码,求详细思考过程
后序遍历:若树不空,则先依次后根遍历各棵子树,然后访问根结点。(先左后右)
中序遍历:若树不空,则先访问左子树,再访问根,再访问右子树。
从后序遍历:CDABE得出E是最顶根节点。
然后中序遍历:CADEB得出CAD是E的左子树中的,B是E的右子树中的。
再分析后序遍历CDA可以知道A是CD的根,
而中序是CAD得到C是A的左子树,D是A的右子树。(如下图)
最后,先序遍历:若树不空,则先访问根结点,然后依次先根遍历各棵子树。
于是得到结束: 先序遍历是 EACDB
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个节点的树}
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层。
当然比较简单的题画图会很好解。
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);}
8. C语言二叉树问题?
敲码不易,望采纳!