试编写算法,判断两颗棵以二叉链表表示的二叉树p和q是否相似。(C语言版)

2024-05-10

1. 试编写算法,判断两颗棵以二叉链表表示的二叉树p和q是否相似。(C语言版)

我昨天答过一个贴子,同样的。
这个题目非常好,是智力题,感兴趣就替你想想:
首先要搞清什么叫“相似”,这要定义好:
如果有两个树的左右子树也对应相类,称“相似”。那程序就好编了,象遍历一样,仍用“递归”。 
算法:
1. 如果两个树,都是空,就是相似;
2. 如果两个树都不空,左子树与左子树也相似,右子树与右子树也相类,则这两树相似,
  这里明显是递归了;
3. 否则,两树中肯定有一个为空,另一个不为空,这种情况不相似; 
 bool  Similar(node * t1,node * t2)
  {
     if   (t1==NULL   &&   t2==NULL)     //  两树都空
           return(true);          //  空树,相似
   else
     if  (t1!=NULL   &&   t2!=NULL)    //  两树非空
         {    //  有递归,下面拆开的目的,提高递归效率
           if ( ! Simila(t1->Left,t2->Left))
                             return(false);              //  左跟左不相似,则树不相似
           if (! Simila(t1->Right,t2->Right))  
                             return(false);             //   右跟右不相似,则树不相似
           return(true);                     //  排除了不相似的情况,就是相似的了
     }
    else
            return(false);              // 剩下的情况就是一个空,另一个不空,肯定不相似
}

main()
{
         node  *  p,  * q;
        //.................
              if Simila(p,q))
                  ; //  显示“ 树相似”
        else
                  ; //  显示“树不相似
}

试编写算法,判断两颗棵以二叉链表表示的二叉树p和q是否相似。(C语言版)

2. 4. 设二叉树的存储结构为二叉链表,试写出算法(C函数):将所有结点的左右子树互换。

二叉树 (binary tree) 是另一种树型结构,它的特点是每个结点至多只有二棵子 树 (即二叉树中不存在度大于 2的结点 ),并且,二叉树的子树有左右之分,其次序不能任意颠倒 . 二叉树是一种数据结构 :

                       Binary_tree=(D,R)

其中: D是具有相同特性的数据元素的集合 ;若 D等于空 ,则 R等于空称为空的二叉树 ;若 D等于空则 R是 D上某个二元关系 H的集合,即 R=,且 
(1) D 中存在唯一的称为根的元素 r,它的关系 H下无前驱 ; 
(2) 若 D-不等于空,则 D-=,且 Dl交 Dr等于空 ;
(3) 若 Dl不等于空 ,则在 Dl中存在唯一的元素 xl,〈 r,xl〉属于 H,且存在 Dl上的关系 Hl属于 H; 若 Dr不等于空 ,则在 Dr中存在唯一的元素 xr,〈   r,xr〉 >属于 H, 且存 Dr上的关 系 Hr属于 H; H=; 
(4) (Dl, Hl) 是一棵合本定义的二叉树,称为根 r的左子树 ,(Dr,Hr)是一棵符合定义的二叉树,称为根的右子树。 

其中,图 6.2 是各种形态的二叉树 . 



(1) 为空二叉树    (2)只有一个根结点的二叉树     (3)右子树为空的二叉树    (4)左子树为空的二叉树    (5)完全二叉树 

二叉树的基本操作: 

(1)INITIATE(BT ) 初始化操作。置 BT为空树。 

(2)ROOT(BT)\ROOT(x) 求根函数。求二叉树 BT的根结点或求结点 x所在二叉树的根结点。
  若 BT是空树或 x不在任何二叉树上,则函数值为 “空 ”。 

(3)PARENT(BT,x) 求双亲函数。求二叉树 BT中结点 x的双亲结点。若结点 x是二叉树 BT 的根结点
   或二叉树 BT中无 x结点,则函数值为 “空 ”。 

(4)LCHILD(BT,x) 和 RCHILD(BT,x) 求孩子结点函数。分别求二叉树 BT中结点 x的左孩 子和右孩子结点。
   若结点 x为叶子结点或不在二叉树 BT中,则函数值为 “空 ”。 

(5)LSIBLING(BT,x) 和 RSIBING(BT,x) 求兄弟函数。分别求二叉树 BT中结点 x的左兄弟和右兄弟结点。
   若结点 x是根结点或不在 BT中或是其双亲的左 /右子树根 ,则函树值 为 “空 ”。 

(6)CRT_BT(x,LBT,RBT) 建树操作。生成一棵以结点 x为根,二叉树 LBT和 RBT分别为左, 右子树的二叉树。 

(7)INS_LCHILD(BT,y,x) 和 INS_RCHILD(BT,x) 插入子树操作。将以结点 x为根且右子树为空的二叉树
  分别置为二叉树 BT中结点 y的左子树和右子树。若结点 y有左子树 /右子树,则插入后是结点 x的右子树。 

(8)DEL_LCHILD(BT,x) 和 DEL-RCHILD(BT,x) 删除子树操作。分别删除二叉树 BT中以结点 x为根的左子树或右子树。
   若 x无左子树或右子树,则空操作。 

(9)TRAVERSE(BT) 遍历操作。按某个次序依此访问二叉树中各个结点,并使每个结点只被访问一次。 

(10)CLEAR(BT) 清除结构操作。将二叉树 BT置为空树。 

5.2.2   二叉树的存储结构

一 、顺序存储结构 
        连续的存储单元存储二叉树的数据元素。例如图 6.4(b)的完全二叉树 , 可以向量 (一维数组 ) bt(1:6)作它的存储结构,将二叉树中编号为 i的结点的数据元素存放在分量 bt[i]中 ,如图 6.6(a) 所示。但这种顺序存储结构仅适合于完全二叉树 ,而一般二叉树也按这种形式来存储 ,这将造成存 贮浪费。如和图 6.4(c)的二叉树相应的存储结构图 6.6(b)所示,图中以 “0”表示不存在此结点 . 



二、 链式存储结构 
    由二叉树的定义得知二叉树的结点由一个数据元素和分别指向左右子树的两个分支构成 ,则表 示二叉树的链表中的结点至少包含三个域 :数据域和左右指针域 ,如图 (b)所示。有时 ,为了便于找 到结点的双亲 ,则还可在结点结构中增加一个指向其双亲受的指针域,如图 6.7(c)所示。 



5.3  遍历二叉树         

         遍历二叉树 (traversing binary tree)的问题, 即如何按某条搜索路径巡访树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。 其中常见的有三种情况:分别称之为先 (根 )序遍历,中 (根 )序遍历和后 (根 )序遍历。 

5.3.1 前序遍历

    前序遍历运算:即先访问根结点,再前序遍历左子树,最后再前序遍历右子树。前序遍历运算访问二叉树各结点是以根、左、右的顺序进行访问的。例如: 



    按前序遍历此二叉树的结果为: Hello!How are you? 

proc preorder(bt:bitreprtr) 
  if (bt<>null)[ 
    print(bt^); 
    preorder(bt^.lchild); 
    preorder(bt^.rchild);] 
end; 

5.3.2 中序遍历

    中序遍历运算:即先中前序遍历左子树,然后再访问根结点,最后再中序遍历右子树。中序遍历运算访问二叉树各结点是以左、根、右的顺序进行访问的。例如: 



    按中序遍历此二叉树的结果为: a*b-c 

proc inorder(bt:bitreprtr)
  if (bt<>null)[ 
    inorder(bt^.lchild); 
    print(bt^); 
    niorder(bt^.rchild);] 
end; 

5.3.3 后序遍历

    后序遍历运算:即先后序遍历左子树,然后再后序遍历右子树,最后访问根结点。后序遍历运算访问二叉树各结点是以左、右、根的顺序进行访问的。例如: 



    按后序遍历此二叉树的结果为: Welecome to use it! 

proc postorder(bt:bitreprtr) 
  if (bt<>null)[ 
    postorder(bt^.lchild); 
    postorder(bt^.rchild);] 
    print(bt^); 
end; 

  

五、例:
   1.用顺序存储方式建立一棵有31个结点的满二叉树,并对其进行先序遍历。
   2.用链表存储方式建立一棵如图三、4所示的二叉树,并对其进行先序遍历。
   3.给出一组数据:R=,试编程序,先构造一棵二叉树,然后以中序遍历访问所得到的二叉树,并输出遍历结果。
   4.给出八枚金币a,b,c,d,e,f,g,h,编程以称最少的次数,判定它们蹭是否有假币,如果有,请找出这枚假币,并判定这枚假币是重了还是轻了。
       
 
中山纪念中学三鑫双语学校信息学竞赛组编写 2004.7.15

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

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

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

4. 若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用( )遍历方法最合适。

答案:C。用二叉链表存储结构也就是左孩子右兄弟的存储结构。
后序遍历比较合理。正常的逻辑应该就是:做好当前结点子树内部的交换,然后交换当前结点的左右子树。刚好符合后序遍历的算法逻辑。
1、交换好左子树
2、交换好右子树
3、交换左子树与右子树
其他算法如先序和按层次其逻辑都差不多,即访问当前结点时交换其左右子树。从逻辑上来看稍显别扭一点点。因此说最合适应该是后序遍历,但是从实现上来说先序和按层次都是可以的。
1、交换左子树与右子树
2、遍历左子树
3、遍历右子树
按层次遍历
1、根结点入队列
2、出队列,交换其左右子树,将子树的根入队列
3、重复2直到队列为空
中序遍历相对较难实现一些。

扩展资料:树的遍历是树的一种重要的运算。树的3种最重要的遍历方式分别称为前序遍历、中序遍历和后序遍历。
以这3种方式遍历一棵树时,若按访问结点的先后次序将结点排列起来,就可分别得到树中所有结点的前序列表、中序列表和后序列表。相应的结点次序分别称为结点的前序、中序和后序。
参考资料来源:百度百科-遍历

5. 假设二叉树以二叉链表作为存储结构,试设计一个计算二叉树叶子结点树的递归算 法 要求用递归算法啊

1、首先要定义两个类:结点类和二叉树类。

2、二叉树类的组成:建立树的函数、遍历函数、删除函数。求结点数函数。

3、采用递归的思想,遇到标识符表示该结点为空,否则开辟空间创建新结点,同时调用递归开辟左结点和右结点。

4、前序遍历函数。

5、删除函数的思路:如果当前结点不为空,采用递归访问左结点和右结点、回收当前结点的空间。

6、求结点数函数的思路:如果当前结点为空,返回0、如果当前结点的左右孩子都为空,放回1。

7、求树高函数的思路:如果当前结点为空,返回0、递归访问左孩子和右孩子、比较左右孩子的高度,返回 较大值+1。

假设二叉树以二叉链表作为存储结构,试设计一个计算二叉树叶子结点树的递归算 法 要求用递归算法啊

6. 这是一道数据结构的题:试写一个判别给定二叉树是否为二叉排序树的算法,设此二叉树以二叉链表作存储结构

用递归:
a=当前节点是否为排序树,是为1,不是为0
f(x)=1 当x为叶节点 
f(x)= a&&f(x->lchid)&&f(x-rchild)  当x非叶节点
----------------------------------------------------------------------
int IsAVTree(BiTree t)
{
int a=1;
if(t->Child==NULL&&t->Rchild==NULL)  return 1;  //叶子节点判断
if((t->Lchild->data>t->data)||(t->Rchild->datadata)) 
{
a=0;
a=a&&(isAVTree(t->Lchild))&&(IsAVTree(t->Rchild));
}
return a;
}
扩展资料:构成递归需具备的条件:
一、子问题须与原始问题为同样的事,且更为简单;
二、不能无限制地调用本身,须有个出口,化简为非递归状况处理。
在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。
例如,下列为某人祖先的递归定义:
某人的双亲是他的祖先(基本情况)。某人祖先的双亲同样是某人的祖先(递归步骤)。斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8。
参考资料来源:百度百科-递归

7. 数据结构试题;设一棵二叉树以二叉链表为存储结构,试写一算法求该二叉树上度为2的结点个数

算法步骤:
设根节点为 r。
情况1,如果 r 既有左孩子又有右孩子,则返回 1 + 递归求左子树度为2节点个数 + 递归求右子树度为2节点个数。
情况2,如果 r 只有左孩子,则返回 递归求左子树度为2节点个数。
情况3,如果 r 只有右孩子,则返回 递归求右子树度为2节点个数。
情况4,如果 r 既没有左孩子又没有右孩子,则返回 0。

数据结构试题;设一棵二叉树以二叉链表为存储结构,试写一算法求该二叉树上度为2的结点个数

8. 试对下图中的二叉树画出其二叉链表存储表示的示意图 谢谢哪位帮忙解答一下。

0

最新文章
热门文章
推荐阅读