数据结构实习——二叉树及其应用

一、实习题目及要求

1、题目:
二叉树基本算法的实现
2、功能要求:
(1)键盘输入二叉树结点前序序列,创建一棵二叉树;
(2)实现SwapTree方法,以根结点为参数,交换每个结点的左子树和右子树(提示:前序递归);
(3)实现Find方法,查找值为key的结点,并输出该结点的所有祖先结点。
3、创建要求:
(1)要求键盘输入二叉树前序序列(程序5.12)
(2)空结点以#表示
4、可选方法:
(1)对BinaryTree模板进行功能扩充
(2)自己定义并实现二叉树类

二、问题描述

本题要求我们实现二叉树的基本算法,并进行相应的功能补充,由数据结构中二叉树的定义可知,二叉树的结点由一个数据元素和分别指向其左、右子树的两个分支构成,所以在本程序二叉树的构造是采用二叉链表的链式存储结构,链表中的结点应包含三个域:数据域和左、右孩子的指针域。这种存储结构可以方便二叉树的建立以及遍历。输入二叉树的先序序列字符,建立二叉链表。

三、问题分析

本题我选用的方法是对BinaryTree模板进行功能扩充,根据题意,我们需要增加两个功能函数;首先第一个函数是要实现左右子树的交换,题目中提示我们可以运用前序递归,这里我们就可以运用值传递的原理来进行左右指数的交换;第二的函数要求我们实现Find的方法,(这里我额外编写了函数FindAncestor来完成相关功能)查找值为key的结点,并输出该结点的所有祖先结点,所以我们不光要实现key结点的查找,还要运用parent函数把所有的祖先节点全部输出。

四、设计思想

本题要求我们实现键盘输入二叉树结点前序序列,创建一棵二叉树,然后交换每个结点的左子树和右子树,并输出,再查找值为key的结点,并打印该结点的所有祖先结点。为实现上述功能,需要解决的关键问题是二叉树建立过程、二叉树左右子树的交换、查找值等于key的结点过程和存储查找结点的所有祖先结点过程。基本可以归结为以下三点:
1.建立二叉树时,按照完全二叉树的结点顺序输入,#表示空结点。 若不是空结点时,则建立一个新结点,并且将其作为左孩子或右孩子结点连接到它的父结点上(第一个结点无父结点);若是空结点,则将空结点(NULL)作为左孩子或右孩子结点连接到它的父节点上;
2.为实现二叉树左右子树的交换,则需要利用前序递归,原理同值传递的原理相同,设置中间指针变量med,然后再进行交换操作;
3.为实现输出所有祖先节点,则需要利用递归前序遍历算法遍历二叉树,在遍历过程中,将遍历的根结点的关键字与所给查找关键字key比较,相等时结束遍历;不等时继续遍历查找直至找到等于所给查找关键字的根结点或遍历完整棵二叉树;在遍历过程中,需将访问过的结点存入栈中,并同时访问该结点的左孩子结点,若左孩子结点是待查找结点,则栈中结点即是左孩子结点的所有祖先结点,然后依次出栈输出信息。

五、调试报告

【调试一】
起初,我编写了SwapTree函数,在测试过程中我发现,输出的前序序列结果并不正确(如图①所示),经过调试,我发现,在运行时,并没有实际调用SwapTree函数,原来是因为我并没有把二叉树的根节点传入SwapTree函数,导致直接输出了所输入的前序序列。
于是,为方便传入根节点,也方便在主函数中的调用,这里我效仿BinaryTree头文件中对于Find、Parent等函数的方式在编写了公有函数SwapTree,即BinTreeNode * SwapTree(){return SwapTree(root);},在这个函数中把根节点传入,即可正常运行并输出正确的交换后的前序序列。

图①

【调试二】
在测试过程中出现如图②所示的错误,经过调试发现结点指针a我把它初始化给了根节点,所以造成如下错误。此外在修改代码的过程我发现我的Find函数也出现了问题,于是我在原Find函数的基础上进行了如下更改:

bool Find(T &x, BinTreeNode<T> * &a){return Find(root, x, a);}
template<typename T>bool BinaryTree<T>::Find(BinTreeNode<T> *subTree, T &x, BinTreeNode<T>* &a)const{//在子树中寻找数据为x的结点if (!subTree){return false;}if (subTree->data == x){a = subTree;return true;}bool p = false;p = Find(subTree->leftChild, x, a);if (p) {return true;}else{return Find(subTree->rightChild, x, a);}
}

更改后,测试正确,如图③所示。

图②

图③

【调试三】
为了把二叉树按照目录结构方式输出二叉树这里在主函数中调用了头文件BinaryTree中的Output函数如图④所示。输出结果显示,交换前的二叉树并不是正确的结构,而左右子树交换后的二叉树也不是正确结构,二者正好相反,通过检查发现,在头文件BinaryTree中的Output函数存在一点小问题,需要吧函数中的左右子树结点更改一下,即可正确输出,如图⑤所示。

图④

图⑤

【调试四】
最后,把输出界面、提示完善一下,如图⑥所示。

图⑥

六、附录

【源代码】

BinaryTree.h核心函数

bool Find(T &x, BinTreeNode<T> * &a){return Find(root, x, a);}BinTreeNode<T> * SwapTree(){return SwapTree(root);}void FindAncestor(void(*visit)(BinTreeNode<T> *t), T &x){FindAncestor(root, visit, x);}bool Find(BinTreeNode<T> *subTree, T &x, BinTreeNode<T>* &a)const;//在子树中寻找数据为x的结点BinTreeNode<T> * SwapTree(BinTreeNode<T> *subTree);  //交换左右数结点void FindAncestor(BinTreeNode<T> *subTree, void(*visit)(BinTreeNode<T> *t), T &x);  //输出所有祖先节点template<typename T>bool BinaryTree<T>::Find(BinTreeNode<T> *subTree, T &x, BinTreeNode<T>* &a)const{//在子树中寻找数据为x的结点if (!subTree){return false;}if (subTree->data == x){a = subTree;return true;}bool p = false;p = Find(subTree->leftChild, x, a);if (p)  {return true;}else{return Find(subTree->rightChild, x, a);}
}

.cpp文件代码

#include "stdafx.h"
#include<iostream>
#include"BinaryTree.h"
using namespace std;template <typename T>BinTreeNode<T> *BinaryTree<T>::SwapTree(BinTreeNode<T> *subTree){BinTreeNode<T> *med;if (subTree == NULL) return NULL;else{med = SwapTree(subTree->leftChild);subTree->leftChild = SwapTree(subTree->rightChild);subTree->rightChild = med;return subTree;}
}template <typename T>void BinaryTree<T>::FindAncestor(BinTreeNode<T> *subTree, void(*visit)(BinTreeNode<T> *t), T &x){BinTreeNode<T> *a;if (Find(subTree, x, a)){LinkedStack<BinTreeNode<T> *> S;if (subTree == a){cout << "The node has been queried,but it is the root node which has no parent node." << endl;}else{do{a = Parent(subTree, a);S.Push(a);} while (a != subTree);while (S.Pop(a)) visit(a);}}else{cout << "Unable to find a node with a value of key." << endl;}}void visit(BinTreeNode<char> *t){cout << t->data << "   ";
}int _tmain(int argc, _TCHAR* argv[])
{BinaryTree<char> binTree('#');char b;cout << "Please enter the binray tree prefix sequence of tree nodes:"<<endl;cin >> binTree;binTree.Output();cout << "After swapping the position of the left and right subtree, the binray tree prefix sequence of tree nodes is : "<<endl;binTree.SwapTree();binTree.PreOrder(visit);cout << endl;binTree.Output();cout << endl;cout << "Please enter the value of key:";cin >> b;cout << "All ancestral nodes of the node are:";binTree.FindAncestor(visit, b);cout << endl;return 0;
}

【测试数据】

1、前序序列:ABC##DE#G##F###; 值为key的结点:C
2、前序序列:ABC##DE#G##F###; 值为key的结点:A
3、前序序列:ABC##DE#G##F###; 值为key的结点:H

【测试结果】

1、

2、

3、

c++ 数据结构——二叉树的构建及其应用,实现左右子树交换并输出前序递归结果相关推荐

  1. Java交换二叉树的左右子树_将二叉树所有结点的左右子树交换并输出。

    import java.util.*; public class BinaryTree { protected Node root; public BinaryTree(Node root) { th ...

  2. 信号放大器数据结构_[11/11]数据结构 二叉树应用(树型信号放大器,file transfer,遍历的非递归实现)...

    树型分布网络信号放大器 森林和二叉树的相互转换 并查集 例题:File transfer #include <iostream> using namespace std; //typede ...

  3. 百练+二叉树操作+直接找到父节点,然后交换左右儿子,递归

    点击打开链接 #include<stdio.h> #include<stdlib.h> #include<iostream> #include<string. ...

  4. 算法与数据结构 -- 二叉树(六)

    一.二叉树 满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的.对于深度为K的,有n个结点的二叉 ...

  5. 数据结构-二叉树、搜索树、平衡二叉树详解及C语言实现

    目录 1. 树概念及结构 1.1.树的概念 1.2.树的定义 1.3.树的一些基本术语 1.4.树的表示 1.4.1.儿子兄弟表示法 1.4.2.双亲表示法 1.4.3.孩子表示法 2.二叉树及存储结 ...

  6. 数据结构——二叉树总结

    数据结构-二叉树总结 写在前面 二叉树遍历 递归实现先.中.后序遍历 非递归遍历 先序非递归 中序非递归 后序非递归 层次遍历 二叉树还原 先序中序建树 后序中序建树 层次中序建树 二叉树应用 二叉查 ...

  7. 数据结构--二叉树的实现(C++)

    前言 数据结构实验作业--用二叉链表实现二叉树(c++版) 包括二叉树的构建.二叉树的销毁,前序遍历.中序遍历.后序遍历.层序遍历等基本操作. 还有求二叉树的叶子结点个数,二叉树的深度.结点个数等. ...

  8. 数据结构——二叉树的修改与构造

    数据结构--二叉树的修改与构造 一.修改二叉树 226. 翻转二叉树 1.前/后序递归 2.广度优先搜索迭代 3.拓展:修改中序遍历 / 中序统一迭代写法 114. 二叉树展开为链表 二.构造二叉树 ...

  9. 数据结构---二叉树的顺序结构及实现

    二叉树的顺序结构及实现 1. 二叉树的顺序结构 2. 堆的概念及结构 3. 堆的实现 3.1 堆向下调整算法 3.2 堆排序 3.2.1 堆排序完整代码 3.3 堆的插入 3.3.1 堆的向上排序算法 ...

最新文章

  1. 铁路运货的运费与路程远近java_JAVA铁路运货的运费与路程远近及货物的重 – 手机爱问...
  2. mysql数据集_Mysql 数据库-我的测试环境
  3. R数据导入导出(一): read.table()和read.csv()的区别
  4. 【工具】更新最新esp8266库离线安装包3.0.1、ESP32库离线安装包1.0.6
  5. 多级cache之间的替换(缓存)策略
  6. 【Salient Object Detection】显著性物体检测资料汇总
  7. nhibernate事务锁表的问题
  8. spring-boot(2)--环境搭建
  9. VSTO之一:Word外接程序
  10. 格雷码与二进制转换电路设计
  11. 国税计算机安全管理制度,武汉市国家税务局关于印发《计算机中心机房管理制度》的通知...
  12. mysql数据库首次查询缓慢
  13. 永洪科技怎么样_「永洪科技」北京永洪商智科技有限公司怎么样? - 职友集
  14. 天河二号上运行ZHT(a zero-hop distributed table)
  15. 【全局盘点】华为云政企全栈技术创新能力图谱
  16. 2020年美容师(初级)多少钱及美容师(初级)模拟考试题库
  17. 开源python语音识别_5 款不错的开源语音识别/语音文字转换系统
  18. Java系统线上生产问题排查一把梭
  19. 669-Server端如何感知客户端的状态
  20. 河北省计算机三级报考人数已满,保定应届生研究生报名考点人数已满 紧急求助...

热门文章

  1. akka 与kafka
  2. 基于改进YOLOv7&OpenCV的行人过马路速度与交通灯实时监测系统(源码&教程)
  3. 注解与反射 - 注解
  4. 卷积神经网络常用模型,卷积神经网络数学建模
  5. 上海电子计算机学校招生要什么条件,【上海市致远中学招生简章/入学条件|上海市致远中学】- 上海房天下...
  6. tdk磁材手册_TDK 集团发布关于铝电解电容器的完整修订版 《数据手册》
  7. PHP 开发环境配置
  8. 如何白手起家挣到一百万?
  9. 视频文件头解析--wma
  10. 无情,才是世上最远的距离!