二叉树构造

同一棵二叉树(节点值均不相同)具有唯一的先序、中序、后序序列和层次序列,但不同的二叉树可能具有相同的先序、中序序列、后序序列和层次序列,二叉树的构造就是根据提供的某些遍历序列构造二叉树的结构。

  • 由先序序列和中序序列构造二叉树:先序序列提供了二叉树的根节点的信息(任何一棵二叉树的先序序列的第一个节点为根节点),而中序序列提供了由根节点将整个序列分为左、右子树的信息。

    • 确定树的根节点:先序遍历的第一个节点
    • 求解树的子树:找出根节点在中序遍历中的位置,根左边的是左子树,右边的是右子树。
    • 递归求解树:将左子树和右子树看成一棵二叉树,重复上面步骤
      ?
  • 由后序序列和中序序列构造二叉树:后序序列提供了二叉树的根节点的信息(任何一棵二叉树的先序序列的最后一个节点为根节点),而中序序列提供了由根节点将整个序列分为左、右子树的信息。
    • 确定树的根节点:后序遍历的最后一个节点
    • 求解树的子树:找出根节点在中序遍历中的位置,根左边的是左子树,右边的是右子树。
    • 递归求解树:将左子树和右子树看成一棵二叉树,重复上面步骤
      ?
  • 由层次序列和中序序列构造二叉树:层次序列提供了二叉树的根节点的信息(任何一棵二叉树的层次序列的第一个节点为根节点),而中序序列提供了由根节点将整个序列分为左、右子树的信息。
    • 确定树的根节点:层次遍历的第一个节点
    • 求解树的子树:找出根节点在中序遍历中的位置,根左边的是左子树,右边的是右子树。
    • 递归求解树:将左子树和右子树看成一棵二叉树,重复上面步骤。

森林和二叉树的相互转换

  • 树转换为二叉树
    ?
  • 森林转换为二叉树
    ?
  • 二叉树转换为树
    ?
  • 二叉树转换为森林
    ?
    ?
    ?
  • 树的先序遍历与其转换的相应的二叉树的先序遍历的结果序列相同
  • 树的后序遍历与其转换的二叉树的中序遍历的结果序列相同
  • 森林的先序遍历和中序遍历与所转换得到的二叉树的先序遍历和中序遍历的结果序列相同。

假设一棵二叉树采用二叉链存储结构,设计一个算法求二叉树的高度。

  • 方式 \(1\) —采用递归方式「基于后序遍历」,先计算左子树的高度,然后计算右子树的高度,最后比较左、右子树的高度,返回较大的那个高度\(+1\)就是二叉树的高度。
    ?
    ?
  • 方式 \(2\) —采用层次遍历,基本思路是访问完每一层的所有节点之后则二叉树的深度加 \(1\)。若根节点为空,则返回 \(0\),若根节点为非空,则第一层的节点个数肯定为 \(1\)个,当第一个节点出栈后二叉树的深度就加 \(1\)了,然后记录这个节点的子节点的个数,当第二层的所有节点都出完队后,也就是第二层的节点都访问完了,此时二叉树的深度加\(1\),如此重复,直到遍历完二叉树。
    ?
    ?
    采用一个变量\(last\)记录每层的最右节点,当访问节点的 \(front==last\) 时,即表示这一层访问结束,这时高度应该加\(1\)。
    ?
  • 方式 \(3\)—采用二叉树的后序遍历非递归算法。根据二叉树后序遍历的定义,先访问根结点的左子节点,然后访问根结点的右子节点,最后访问根结点。如果节点值非空,首先应该进入该节点的左子树访问,此时由于该节点的右子树及根结点尚未访问,因此必须将该节点保存起来,放入栈中,以便访问完左子树后,从栈中取出该节点,进行其右子树及根结点的访问。确切的说,当一个元素位于栈顶即将处理时,其左子树的访问一定已经完成,如果其右子树尚未遍历,接下来应该进入其右子树访问,而此时该栈顶元素是不能出栈的,因为其根结点还未被访问;只有等到其右子树也访问完成后,该栈顶元素才能出栈。所以,后序遍历能够找出最长的路径,每次节点进栈后,求出当前栈的大小,遍历结束后返回最大的栈长度即为树的深度。
    ?

假设二叉树采用二叉链表存储结构,设计一个算法,求非空二叉树\(b\)的宽度(即具有节点数最多的那一层的节点个数)。

  • 方式 \(1\),采用层次遍历:在遍历的时候记录每个节点的所在的层次,然后求层次值最大的平台。
    ?
    ?
  • 方式 \(2\): 采用层次遍历:直接记录每一层的节点数目,然后将每一层的节点数目和当前最大的那个比较,得出最终的宽度。
    ?
    ?

假设一棵二叉树采用二叉链存储结构,设计一个算法求二叉树中的所有叶子节点。

?

假设二叉树采用二叉链表存储结构,设计一个算法把二叉树 \(b\) 复制到 \(t\) 中。

?

假设二叉树采用二叉链表存储结构,设计一个算法将二叉树的左右子树进行交换,要求不破坏原二叉树。

?

假设二叉树采用二叉链表存储结构,设计一个算法判断两棵二叉树是否相等。

?

设计一个算法将二叉树的顺序存储结构转换为二叉链表存储。

?

设计一个算法将二叉树的二叉存储结构转换为顺序存储。

?

假设二叉树采用二叉链存储结构,设计一个算法求二叉树中节点值为 \(x\) 的节点层数。

?

?

?

时间: 2024-08-03 11:24:08

二叉树构造的相关文章

由二叉树构造赫夫曼树

赫夫曼树: 假设有n个权值{w1,w2,w3....},试构造一棵具有n个叶子节点的二叉树,每个叶子节点带权为wi,则其中带权路径长度最小的二叉树称为最优二叉树或者叫赫夫曼树. 构造赫夫曼树: 假设有n个权值,则构造出的赫夫曼树有n个叶子节点,n个权值分别设置为w1,w2,....wn,则赫夫曼树的构造规则为: 1.将w1,w2...看成是有n棵树的森林: 2.在森林中选择两个根节点的权值最小的树合并,作为一棵新树的左右子树,且新树的根节点权值为其左右子树根节点权值之和: 3.从森林中删除选取的

写了一个二叉树构造及中序遍历函数

本题就是测试读入数据的速度的. 如果有大量的数据读入,使用cin是很慢的. 那么使用scanf那么会快很多,但是如果数据量更大的话那么就还是不够快了. 所以这里使用fread. 首先开一个buffer,然后使用fread大块大块地读入数据就可以非常快地读入了. 题目如下: Input The input begins with two positive integers n k (n, k<=107). The next n lines of input contain one positive

二叉树构造、遍历和释放--自己写数据结构

直接上代码 bitree.h文件如下: #ifndef _BITREE_H_ #define _BITREE_H_ typedef char TElemType; typedef struct _BitNode { TElemType data; struct _BitNode *lchild,*rchild; }BitNode,*pBitNode; int bittree_creat(BitNode **T); void pre_order(BitNode *T); void mid_orde

数据结构二叉树构造及遍历详解

前言 最近学到了二叉树,就学着将二叉树构造,并尝试三种遍历操作.本次主要使用递归,回头会整理非递归的方法. 定义二叉树 1 typedef struct BinaryTree 2 { 3 TelemType data; 4 struct BinaryTree *lchild; 5 struct BinaryTree *rchild; 6 }*Node,node; 其中要注意Node是结构体指针,这样定义以后使用会方便很多. 构造二叉树 1 Node CreatTree() 2 { 3 Node

算法题:用二叉树构造双向链表

#include <iostream> #include <string.h> using namespace std; struct Node { Node *left;//相当于双向链表的prev指针. Node *right;//相当于双向链表的next指针. char data; Node(char d = char()):data(d),left(NULL),right(NULL){} }; class MTree { public: MTree():root(NULL)

二叉树的构造与遍历

1 #include <iostream> 2 using namespace std; 3 4 typedef struct node 5 { 6 char data; 7 struct node *lchild; 8 struct node *rchild; 9 }BiTreeNode,*BiTree; 10 11 void createBiTree(BiTree &T) 12 { 13 char c; 14 cin>>c; 15 if(c=='#') T=NULL;

JAVA实现二叉树

树是编程中一种常用的数据结构.以前在学习数据结构时,总想着如何实际地实现出一颗二叉树出来,现在参考了<数据结构与算法分析 JAVA语言描述 第二版>之后,照着书中的例子实现了一颗二叉树,个人感觉书上面的二叉树实现操作比较复杂.下面将我学到的一些知识记录下来: 1,定义树的操作的基本接口,其中不包括插入或删除操作,因为这二种操作与树的结构相关.同时,接口中也不包括遍历操作,因为并不是每个应用都会用到遍历.我们可以定义返回一个迭代器的方法,由于树中有多种不同的遍历,树的类可以含有几个方法,每个方法

数据结构课程设计题目四_二叉树

本文出自:http://blog.csdn.net/svitter 题目4:二叉树 给出一颗无线的二叉树.树的每一个结点用一整数对标识.二叉树构造如下 树根被标识为(1, 1): 如果一个结点被标识为(a, b), 则其左孩子被标识为(a+b,b),右孩子被标识为(a, a+b).现在给出某一结点(a, b),求树根到该结点的最短路径,并且同时求出从树根出发向左走和向右走的次数.建议完成人数1人. 注:此处使用了STL_stack库函数,是不允许的,我图方便. //===============

二叉树的递归遍历 Tree UVa548

题意:给一棵点带权的二叉树的中序和后序遍历,找一个叶子使得他到根的路径上的权值的和最小,如果多解,那该叶子本身的权值应该最小 解题思路:1.用getline()输入整行字符,然后用stringstream获得字符串中的数字 2.用数组in_oder[]和post_order[]分别表示中序遍历和后序遍历的顺序,用数组rch[]和lch[]分别表示结点的左子树和右子树 3.用递归的办法根据遍历的结果还原二叉树(后序遍历的最后一个树表示的是根节点,中序遍历的中间一个表示根节点) 4.二叉树构造完成后