二叉树(C语言)

2024-05-16 19:11

1. 二叉树(C语言)

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

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

二叉树(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语言 什么叫完全二叉树?

完全二叉树是一种特殊的二叉树。
定义:如果一棵具有n个结点的深度为k的二叉树,它的每一个结点都与深度为k的满二叉树中编号为1~n的结点一一对应,这棵二叉树称为完全二叉树。
例:

特点:
叶子结点只可能在最大的两层上出现,对任意结点,若其右分支下的子孙最大层次为L,则其左分支下的子孙的最大层次必为L 或 L+1。
完全二叉树第i层至多有2^(i-1)个节点,共i层的完全二叉树最多有2^i-1个节点。
满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。

5. C语言二叉树问题?








敲码不易,望采纳!

C语言二叉树问题?

6. C语言 二叉树问题

楼主你这问题是不对的。
根据二叉树的性质:
(1)n0 = n2 + 1,由23个度为2的节点,得到叶子节点为24个,23+24=47,因此该二叉树没有度为1的节点。
(2)47个节点的二叉树的深度至少为int(log2(47))+1=6。
根据题意只能得到上面两个结论。事实上你只要画一个满足上面要求的二叉树,看看深度是不是必须为6就知道这个问题对不对了。(实际是不对的,你看看是不是少给什么条件了)

7. 数据结构二叉树C语言

二叉树是一种非常重要的数据结构。本文总结了二叉树的常见操作:二叉树的构建,查找,删除,二叉树的遍历(包括前序遍历、中序遍历、后序遍历、层次遍历),二叉搜索树的构造等。
1. 二叉树的构建
  二叉树的基本构建方式为:添加一个节点,如果这是一棵空树,则将该节点作为根节点;否则按照从左到右、先左子树后右子树的顺序逐个添加节点。比如依次添加节点:1,6,10,2,7,11,则得到的二叉树为:

在这里,我们需要借助一个链表来保存节点,以实现二叉树的顺序插入,具体做法如下:
1.0 初始化一个用来保存二叉树节点的空链表;
1.1 插入一个节点,
①如果该树是一棵空树,则将该节点作为根节点,并且将该节点添加到链表中;
②如果该树不为空,取得链表第一个节点的值(注意不是链表的头节点)。如果该节点左子树为空,则将待插入节点添加到左子树,并且将左子树添加到链表;否则将待插入节点添加到右子树,将右子树添加到链表。此时,父节点的左右子树都不为空,将该父节点(即链表第一个节点)
弹出。
按照这样的顺序,我们就可以完成二叉树节点的顺序插入。

2. 二叉搜索树的构建
   二叉搜索树是这样一棵树:对于任意一个节点,其左子树的值均小于父节点的值;右子树的值均大于父节点的值。从二叉树的根节点开始,对于其左右子树均按照这样的方式递归插入,即可以得到一棵二叉搜索树。二叉搜索树具有很好的性质,因为它的有序性,如果在二叉搜索树中查找一个元素可以按照类似二分查找的方式进行;对于二叉搜索树,如果采用中序遍历则可以得到按照值递增排列的节点。二叉搜索树的具体构建方式如下:
插入一个节点:
2.1如果当前节点本身值为空,则将插入节点直接作为当前节点;
2.2如果当前节点本身值不为空,
①比较插入节点的值与当前节点的值,如果插入节点值小于当前节点值,则将该节点递归插入左子树;
②比较插入节点的值与当前节点的值,如果插入节点值大于当前节点值,则将该节点递归插入右子树;
③ 如果插入节点的值等于当前节点的值,则直接返回(即二叉搜索树每个节点的值都是不同的)。【摘要】
数据结构二叉树C语言【提问】
二叉树是一种非常重要的数据结构。本文总结了二叉树的常见操作:二叉树的构建,查找,删除,二叉树的遍历(包括前序遍历、中序遍历、后序遍历、层次遍历),二叉搜索树的构造等。
1. 二叉树的构建
  二叉树的基本构建方式为:添加一个节点,如果这是一棵空树,则将该节点作为根节点;否则按照从左到右、先左子树后右子树的顺序逐个添加节点。比如依次添加节点:1,6,10,2,7,11,则得到的二叉树为:

在这里,我们需要借助一个链表来保存节点,以实现二叉树的顺序插入,具体做法如下:
1.0 初始化一个用来保存二叉树节点的空链表;
1.1 插入一个节点,
①如果该树是一棵空树,则将该节点作为根节点,并且将该节点添加到链表中;
②如果该树不为空,取得链表第一个节点的值(注意不是链表的头节点)。如果该节点左子树为空,则将待插入节点添加到左子树,并且将左子树添加到链表;否则将待插入节点添加到右子树,将右子树添加到链表。此时,父节点的左右子树都不为空,将该父节点(即链表第一个节点)
弹出。
按照这样的顺序,我们就可以完成二叉树节点的顺序插入。

2. 二叉搜索树的构建
   二叉搜索树是这样一棵树:对于任意一个节点,其左子树的值均小于父节点的值;右子树的值均大于父节点的值。从二叉树的根节点开始,对于其左右子树均按照这样的方式递归插入,即可以得到一棵二叉搜索树。二叉搜索树具有很好的性质,因为它的有序性,如果在二叉搜索树中查找一个元素可以按照类似二分查找的方式进行;对于二叉搜索树,如果采用中序遍历则可以得到按照值递增排列的节点。二叉搜索树的具体构建方式如下:
插入一个节点:
2.1如果当前节点本身值为空,则将插入节点直接作为当前节点;
2.2如果当前节点本身值不为空,
①比较插入节点的值与当前节点的值,如果插入节点值小于当前节点值,则将该节点递归插入左子树;
②比较插入节点的值与当前节点的值,如果插入节点值大于当前节点值,则将该节点递归插入右子树;
③ 如果插入节点的值等于当前节点的值,则直接返回(即二叉搜索树每个节点的值都是不同的)。【回答】
3.二叉搜索树的查找
  二叉搜索树的查找类似于二分查找。具体步骤如下:
3.1 从根节点开始,比较查找值与当前节点值的大小:
① 如果当前节点值为空,则说明无法查找到该值,直接返回;
②如果当前节点值等于查找值,则查找成功;
③如果查找值小于当前节点的值,则递归查找左子树;
④如果查找值大于当前节点的值,则递归查找右子树。

4. 二叉搜索树的删除
   二叉搜索树的删除与查找基本类似,不同之处在于如果查找到了待删除的节点,则将该节点直接删除之后,还要进行如下操作保证删除节点之后的二叉树仍是一棵二叉搜索树:
①如果该删除节点没有左右子树,则直接删除该节点;
②如果该删除节点只有左子树(右子树),则将删除节点的父节点直接指向其左子树(右子树);
③如果该删除节点既有左子树又有右子树,则有下面的三种处理方法:
4.3.1:找到按照中序遍历该删除节点的直接前驱节点,将该节点转移到删除节点,然后删除这个前驱节点;
4.3.2:找到按照中序遍历该删除节点的直接后续节点,将该节点转移到删除节点,然后删除这个后序节点;
4.3.3:找到按照中序遍历该删除节点的直接前驱节点,将删除节点的左子树接到父节点上,将删除节点的右子树接到该前序节点的右子树上,然后删除节点。

5. 二叉树的前序遍历
  由于二叉树是递归定义的,所以二叉树的遍历一般也是采用递归的形式。前序遍历即采用先访问根节点,再访问左子树,最后访问右子树的顺序。前序遍历也是按照类似的方式递归遍历,具体操作如下:
① 如果当前节点值为空,返回;
②如果当前节点值不为空,打印当前节点值;递归遍历左子树;递归遍历右子树。

6. 二叉树的中序遍历
①如果当前节点值为空,返回;
②递归遍历左子树;打印当前节点的值;递归遍历右子树。

7. 二叉树的后序遍历
①如果当前节点值为空,返回;
②递归遍历左子树;递归遍历右子树;打印当前节点的值。

8. 二叉树的层次遍历
  二叉树的层次遍历,即从根节点开始,逐层按照从左到右的顺序遍历。层次遍历比前中后序遍历要麻烦一点,它需要借助一个额外的链表来保存节点进行遍历。具体做法如下:
①初始化一个用来保存二叉树节点的空链表;
②如果这是一棵空二叉树,直接返回;否则将根节点添加到链表;
③while(当链表不为空时)
  弹出链表第一个二叉树节点,打印该二叉树节点的值;
  如果该二叉树节点的【回答】
您好有代码吗【提问】
右子树不为空,则将该右子树添加到链表;

  以上就是关于二叉树的基本操作,下面是C语言具体实现的代码,谨供参考【回答】
您能看到我问题的具体内容吗【提问】
没有【回答】
由先序序列和中序序列以及由中序序列和后序
序列构造一棵二叉树的功能(二叉树中的每个结点值为单个字符),要求以括号表示和凹入
表示法输出该二叉树,并用先序遍历序列“ABDEHJKLMNCFGI”和中序遍历序列
“DBJHLKMNEAFCGI”以及由中序遍历序列“DBJ HLKMNEAFCGI”和后序遍历序列
DJLNMKHEBFIGCA”进行验证
【提问】
你好,这方面我本来不太懂,因为点快点着单了,所以是尽可能的找些对你有用的资料。【回答】
好吧【提问】

数据结构二叉树C语言

8. C语言 数据结构 二叉树实现的疑问

首先敬仰一下楼主的勤奋!

我主要针对第二个算法说,我觉得上面这段话也是在讲第二个算法。其实两个算法差不太多。
1. 栈顶记录中的指针其实就是指栈顶,每次push()进去或者pop()出来的那个p。他代表的是正在访问的节点得下一个节点。比如,访问一个树t的左子树t->lchild时,栈顶就是t;访问t->lchild->lchild时,栈顶就是t->lchild。访问t->rchild时,栈顶为NULL;访问t->lchild->rchild时,栈顶为t;访问t->rchild->lchild时,栈顶也是t;访问t->rchild->rcchild时,栈顶仍为NULL。他的意义就是,在访问完了当前的子树之后,就会去访问栈顶记录的指针对应的节点的数据。
2. 关于“工作记录”那个词,我觉得还是别深究了。那段话意思是要仿照编译器把递归编译成迭代的思路来自己写迭代算法,可是实际上后面给出的算法里根本没有严格执行上述思路,写出来的算法并不是严格意义上的可以一般性替换递归的迭代算法。所以追究那个词也没意义,明白迭代遍历的算法怎么用就够了。等以后对递归有了更深刻的认识,自然就明白了。其实就是函数递归调用自身之前像中断那样保存自己的工作环境和进度。
3. (2)句并不矛盾。他说“指针为空时”和“指针指向的xxx”中间不是有句“退回上一层”么,那就表示pop(),于是原来那个在栈顶的空指针弹出去了,原来在第二位的指针现在到了栈顶。于是后面那句指的是对这个指针进行操作。
另外,虚机团上产品团购,超级便宜
最新文章
热门文章
推荐阅读