与二叉树有关的一些操作:先序,中序,后序,层次遍历,计算深度,叶结点数

博客给出了树的先序、中序、后序、层次遍历的代码实现,还包含计算叶结点数和树的深度的代码。通过递归和队列等方式完成对树的操作,为树结构的处理提供了具体的代码示例。

//先序遍历
template <typename T>
void preorderOutput(tnode<T> *t, const string& separator = "  ")
{
   // the recursive scan terminates on a empty subtree
   if (t != NULL)
   {
      cout << t->nodeValue << separator; // output the node
       inorderOutput(t->left, separator);      // descend left
       inorderOutput(t->right, separator);   // descend right
   }
}

//中序遍历
template <typename T>
void inorderOutput(tnode<T> *t, const string& separator = "  ")
{
   // the recursive scan terminates on a empty subtree
   if (t != NULL)
   {
      inorderOutput(t->left, separator); // descend left
      cout << t->nodeValue << separator; // output the node
      inorderOutput(t->right, separator); // descend right
   }
}

//后序遍历
template <typename T>
void postorderOutput(tnode<T> *t, const string& separator = "  ")
{
   // the recursive scan terminates on a empty subtree
   if (t != NULL)
   {
      postorderOutput(t->left, separator); // descend left
      postorderOutput(t->right, separator); // descend right
      cout << t->nodeValue << separator;   // output the node
   }
}

//层次遍历
template <typename T>
void levelorderOutput(tnode<T> *t, const string& separator = "  ")
{
   // store siblings of each node in a queue so that they are
   // visited in order at the next level of the tree
   queue<tnode<T> *> q;
   tnode<T> *p;

   // initialize the queue by inserting the root in the queue
   q.push(t);

   // continue the iterative process until the queue is empty
   while(!q.empty())
   {
      // delete front node from queue and output the node value
      p = q.front();
  q.pop();
      cout << p->nodeValue << separator;

  // if a left child exists, insert it in the queue
      if(p->left != NULL)
   q.push(p->left);
      // if a right child exists, insert next to its sibling
      if(p->right != NULL)
   q.push(p->right);
   }
}

//计算叶结点数
// assume that count initialized to 0
template <typename T>
void countLeaf (tnode<T> *t, int& count)
{
   if (t != NULL)
   {
      // check if t is a leaf node (no children).
      // if so, increment count
      if (t->left == NULL && t->right == NULL)
         count++;

  countLeaf(t->left, count);  // descend left
  countLeaf(t->right, count); // descend right
   }
}

//计算树的深度,空树深度设为-1
// determine the depth of the tree using a postorder scan
template <typename T>
int depth (tnode<T> *t)
{
   int depthLeft, depthRight, depthval;

   if (t == NULL)
  // depth of an empty tree is -1
   depthval = -1;
   else
 {
  // find the depth of the left subtree of t
  depthLeft= depth(t->left);
  // find the depth of the right subtree of t
  depthRight= depth(t->right);
  // depth of the tree with root t is 1 + maximum
  // of the depths of the two subtrees
  depthval = 1 +
   (depthLeft > depthRight ? depthLeft : depthRight);
   }

 return depthval;
}

二叉树的形态 由 3 个结点可以构造出 ▁▁▁▁▁ 种不同形态的二叉树。 A. 2 B. 3 C. 4 D. 5 分数 1 作者 严蔚敏 单位 清华大学 若一棵非空二叉树遍历后序遍历列正好相反,则该二叉树 ▁▁▁▁▁ 。 A. 所有结点均无左孩子 B. 所有结点均无右孩子 C. 只有一个叶子结点 D. 为任意二叉树 分数 1 作者 严蔚敏 单位 清华大学 二叉树的高度 若根节点为高度1,一棵具有 1025 个结点的二叉树的高度为 ▁▁▁▁▁ 。 A. 10 B. 11 C. 11~1025 之间 D. 10~1024 之间 分数 3 作者 考研真题 单位 浙江大学 对 n 个互不相同的符号进行哈夫曼编码。若生成的哈夫曼树共有 115 个结点,则 n 的值是: A. 56 B. 57 C. 58 D. 60 分数 2 作者 王俊玲 单位 集美大学 度为3的树中第4层上至多有( )个结点。 A. 12 B. 81 C. 27 D. 8 分数 2 作者 王俊玲 单位 集美大学 如果一个完全二叉树最底下一层为第六层(根为第一层)且该层共有8个叶结点,那么该完全二叉树共有多少个结点? A. 31 B. 39 C. 63 D. 71 分数 2 作者 王俊玲 单位 集美大学 若有一二叉树的总结点数为98,只有一个儿子的结点数为48,则该树的叶结点数是多少? A. 25 B. 50 C. 不确定 D. 这样的树不存在 分数 2 作者 王俊玲 单位 集美大学 对于二叉树,如果其中遍历结果遍历结果一样,那么可以断定该二叉树: A. 是完全二叉树 B. 所有结点都没有左儿子 C. 所有结点都没有右儿子 D. 这样的树不存在 分数 2 作者 王俊玲 单位 集美大学 已知一二叉树后序和中遍历的结果分别是FDEBGCA 和FDBEACG,那么该二叉树的前遍历结果是什么? A. ABDFECG B. ABDEFCG C. ABDFEGC D. ABCDEFG 分数 2 作者 王俊玲 单位 集美大学 在上题的搜索树中删除结点1,那么删除后该搜索树的后序遍历结果是: A. 243765 B. 432765 C. 234567 D. 765432 分数 2 作者 王俊玲 单位 集美大学 若一AVL树的结点数是21,则该树的高度至多是多少?注:只有一个根节点的树高度为0 A. 4 B. 5 C. 6 D. 7 分数 2 作者 王俊玲 单位 集美大学 下列列中哪个是最小堆? A. 2, 55, 52, 72, 28, 98, 71 B. 2, 28, 71, 72, 55, 98, 52 C. 2, 28, 52, 72, 55, 98, 71 D. 28, 2, 71, 72, 55, 98, 52 分数 2 作者 王俊玲 单位 集美大学 在最大堆 {97,76,65,50,49,13,27}中插入83后,该最大堆为: A. {97,76,65,83,49,13,27,50} B. {97,83,65,76,49,13,27,50} C. {97,83,65,76,50,13,27,49} D. {97,83,65,76,49,50,13,27} 分数 2 作者 王俊玲 单位 集美大学 对由同样的n个整数构成的二叉搜索树(查找树)和最小堆,下面哪个说法是不正确的: A. 二叉搜索树(查找树)高度大于等于最小堆高度 B. 对该二叉搜索树(查找树)进行中遍历可得到从小到大的列 C. 从最小堆根节点到其任何叶结点的路径上的结点值构成从小到大的列 D. 对该最小堆进行按层(level order)遍历可得到从小到大的列 分数 2 作者 王俊玲 单位 集美大学 为五个使用频率不同的字符设计哈夫曼编码,下列方案中哪个不可能是哈夫曼编码? A. 00,100,101,110,111 B. 000,001,01,10,11 C. 0000,0001,001,01,1 D. 000,001,010,011,1 分数 2 作者 王俊玲 单位 集美大学 已知a、b两个元素均是所在集合的根结点,且分别位于数组分量3和2位置上,其parent值分别为-3,-2。问:将这两个集合按集合大小合并后,a和b的parent值分别是多少? A. -5,2 B. -5,3 C. -3,3 D. 2,-2 分数 2 作者 王东 单位 贵州师范学院 在下列存储形式中,( )不是树的存储形式。 A. 双亲表示法 B. 孩子链表表示法 C. 孩子兄弟表示法 D. 顺存储表示法 分数 2 作者 王东 单位 贵州师范学院 引入二叉线索树的目的是( )。 A. 加快查找结点的前驱或后继的速度 B. 为了能在二叉树中方便的进行插入删除 C. 为了能方便的找到双亲 D. 使二叉树遍历结果唯一 分数 2 作者 王东 单位 贵州师范学院 以下说法中,正确的是( )。 A. 在完全二叉树中,叶子结点的双亲的左兄弟(若存在)一定不是叶子结点 B. 任何一棵二叉树,叶子结点个数为度为2的结点数减1,即n0=n2-1 C. 完全二叉树不适合顺存储结构,只有满二叉树适合顺存储结构 D. 结点按完全二叉树编号的二叉树中,第i个结点的左孩子的编号为2i 分数 2 作者 王东 单位 贵州师范学院 若一棵深度为6的完全二叉树的第6层有3个叶子结点,则该二叉树共有( )个叶子结点。 A. 17 B. 18 C. 19 D. 20 分数 2 作者 王东 单位 贵州师范学院 若一棵二叉树有126个结点,在第7层(根结点在第1层)至多有( )个结点。 A. 32 B. 64 C. 63 D. 不存在第7层 分数 2 作者 王东 单位 贵州师范学院 在一棵完全二叉树中,其根的号为1,(  )可判定号为 p和q 的两个结点是否在同一层。 A. ⌊log 2 ​ p⌋=⌊log 2 ​ q⌋ B. log 2 ​ p=log 2 ​ q C. ⌊log 2 ​ p⌋+1=⌊log 2 ​ q⌋ D. ⌊log 2 ​ p⌋=⌊log 2 ​ q⌋+1 分数 2 作者 王东 单位 贵州师范学院 在任何一棵二叉树中,若结点a有左孩子b、右孩子c,则在结点的列、中列、后序列中,( )。 A. 结点b一定在结点a的前面 B. 结点a一定在结点c的前面 C. 结点b一定在结点c的前面 D. 结点a一定在结点b的前面 分数 2 作者 YJ 单位 西南石油大学 在完全二叉树中,若一个结点是叶结点,则它没( )。 A. 左子结点 B. 右子结点 C. 左子结点和右子结点 D. 左子结点,右子结点和兄弟结点 分数 2 作者 YJ 单位 西南石油大学 由3 个结点可以构造出多少种不同的二叉树( ) A. 2 B. 3 C. 4 D. 5 分数 2 作者 YJ 单位 西南石油大学 下面几个符号串编码集合中,不是前缀编码的是( )。 A. {0,10,110,1111} B. {11,10,001,101,0001} C. {00,010,0110,1000} D. {b,c,aa,ac,aba,abb,abc} 分数 2 作者 YJ 单位 西南石油大学 一棵有n个结点的二叉树,按层次从上到下,同一层从左到右顺存储在一维数组A[1..n]中,则二叉树中第i个结点(i从1开始用上述方法编号)的右孩子在数组A中的位置是( )。 A. A[2i](2i<=n) B. A[2i+1](2i+1<=n) C. A[i-2] D. 条件不充分,无法确定 分数 2 作者 YJ 单位 西南石油大学 在二叉树的二叉链表结构中,指针p所指结点为叶子结点的条件是( )。 A. p=NULL B. p->lchild==NULL && p->rchlid==NULL C. p->lchild==NULL D. p->rchlid==NULL 分数 2 作者 YJ 单位 西南石油大学 深度为k的完全二叉树至少有(1)个结点,至多有(2)个结点。 A. (1)2k-1 (2)2k-1 B. (1)2k (2)2 k -1 C. (1)2 k (2)2 k +1 D. (1)2 k−1 (2)2 k -1 分数 2 作者 YJ 单位 西南石油大学 高度为8的完全二叉树至少有( )个叶子结点。 A. 128 B. 63 C. 64 D. 32 分数 2 作者 YJ 单位 西南石油大学 一个深度为k的,具有最少结点数的完全二叉树层次,(同层次从左到右)用自然数依此对结点编号,则编号最小的叶子的号是( )。 A. 2 k−2 B. 2 k−2 +1 C. 2 k−1 +1 D. 2 k−1 分数 2 作者 YJ 单位 西南石油大学 二叉树列和中列相同的条件是( )。 A. 任何结点至多只有左子女的二叉树 B. 任何结点至多只有右子女的二叉树 C. 右子树为空 D. 左子树为空 分数 2 作者 考研真题 单位 浙江大学 给定平衡二叉树如下图所示,插入关键字 23 后,根中的关键字是: t1.png A. 16 B. 20 C. 23 D. 25 分数 2 作者 考研真题 单位 浙江大学 将关键字 6、9、1、5、8、4、7 依次插入到初始为空的大根堆 H 中,得到的 H 是: A. 9、8、7、6、5、4、1 B. 9、8、7、5、6、1、4 C. 9、8、7、5、6、4、1 D. 9、6、7、5、8、4、1 分数 1 作者 张泳 单位 浙大城市学院 若一棵3次树中有2个度为3的节点,1个度为2的节点,2个度为1的节点,该树一共有 ( ) 个节点 A. 5 B. 8 C. 10 D. 11 分数 1 作者 张泳 单位 浙大城市学院 以下关于二叉树的说法中正确的是( ) A. 二叉树中每个节点的度均为2 B. 二叉树中至少有一个节点的度为2 C. 二叉树中每个节点的度可以小于2 D. 二叉树中至少有一个节点 分数 1 作者 张泳 单位 浙大城市学院 一棵二叉树中有7个叶子节点和5个单分支节点,其总共有( )个节点 A. 16 B. 18 C. 12 D. 31 分数 1 作者 张泳 单位 浙大城市学院 深度为5的二叉树至多有 ( )个节点 A. 16 B. 32 C. 31 D. 10 分数 1 作者 张泳 单位 浙大城市学院 一个具有1025个节点的二叉树的高h为( ) A. 11 B. 10 C. 11~1025 D. 12~1024 分数 1 作者 张泳 单位 浙大城市学院 一棵完全二叉树中有501个叶子节点,则至少有 ( ) 个节点 A. 501 B. 502 C. 1001 D. 1002 分数 1 作者 张泳 单位 浙大城市学院 一棵高度为8的完全二叉树至少有( )叶子节点 A. 63 B. 64 C. 127 D. 128 分数 1 作者 张泳 单位 浙大城市学院 一棵满二叉树中127个节点,其中叶子节点的个数是( ) A. 63 B. 64 C. 65 D. 不确定 分数 1 作者 张泳 单位 浙大城市学院 某二叉树遍历列和后序遍历列正好相反,则该二叉树一定是( ) A. 空或只有一个节点 B. 完全二叉树 C. 二叉排树 D. 高度等于其节点数 分数 1 作者 张泳 单位 浙大城市学院 一棵二叉树遍历列为ABCDEF,中遍历列为CBAEDF,则后序遍历列为( ) A. CBEFDA B. FEDCBA C. CBEDFA D. 不确定 分数 1 作者 严蔚敏 单位 清华大学 若一棵非空二叉树 ▁▁▁▁▁,则中遍历层次遍历列完全相同。 A. 所有结点均无左孩子 B. 所有结点均无右孩子 C. 只有一个叶子结点 D. 为任意二叉树 分数 1 作者 李祥 单位 湖北经济学院 若一棵非空二叉树 ▁▁▁▁▁,则中遍历层次遍历列正好相反。 A. 所有结点均无左孩子 B. 所有结点均无右孩子 C. 只有一个叶子结点 D. 为任意二叉树 分数 1 作者 李祥 单位 湖北经济学院 对一棵二叉树的结点从 1 开始顺编号。要求每个结点的编号都小于其子树所有结点的编号,且左子树所有结点的编号都小于右子树所有结点的编号。可采用 ▁▁▁▁▁ 实现编号。 A. 遍历 B. 后序遍历 C. 中遍历 D. 层次遍历 分数 1 作者 严蔚敏 单位 清华大学 分别按以下顺插入结点到空二叉排树中,▁▁▁▁▁ 其它三个列所得到的结果不同。 A. 10, 8, 9, 6, 12, 11, 13 B. 10, 12, 11, 13, 8, 6, 9 C. 10, 6, 8, 9, 12, 11, 13 D.
最新发布
10-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值