二叉树首先要解决构建问题,才能考虑后续的遍历,这里贴出通过先序构建二叉树,同时包含四种二叉树的遍历方法(先序,中序,后序,逐层)

第一、定义BinaryTreeNode 类

 #include <iostream>
#include <string>
#include <queue>
using namespace std; template<typename T >class BinaryTree;
template <typename T> class BinaryTreeNode {
public:
friend class BinaryTree<T>;
BinaryTreeNode() {
data = NULL;
lChild = rChild = NULL;
}
BinaryTreeNode(T newdata) {
this->data = newdata;
lChild = rChild = NULL;
}
T getData() {
return data;
}
BinaryTreeNode<T> * getLeftNode() {
return lChild;
}
BinaryTreeNode<T> * getRightNode() {
return rChild;
}
T data;
BinaryTreeNode<T>* lChild;
BinaryTreeNode<T>* rChild;
private: };

第二、定义BinaryTree 类

 template <typename T> class BinaryTree {
public:
BinaryTreeNode<T> *root;
char* p;
BinaryTree() { root = NULL; }
BinaryTree(T data) {
root = new BinaryTreeNode<T>(data);
root->lChild = NULL;
root->rChild = NULL;
}
~BinaryTree() {
delete root;
} //构建二叉树并返回
BinaryTreeNode<T>* CreateTree() {
BinaryTreeNode<int>* bt = NULL;
char t;
cin >> t;
if (t == '#')
{
return NULL;
}
else {
int num = t - '';
bt = new BinaryTreeNode<T>(num);
bt->lChild = CreateTree();
bt->rChild = CreateTree();
}
return bt;
} //先序构建二叉树
BinaryTreeNode<T>* PreCreateTree() {
BinaryTreeNode<int>* bt = NULL;
if (this->root == NULL)
{
cout << "请输入根节点(#代表空树):";
}
else {
cout << "请输入节点(#代表空树):";
}
char t;
cin >> t;
if (t == '#')
{
return NULL;
}
else {
int num = t - '';
bt = new BinaryTreeNode<T>(num);
if (this->root == NULL)
{
this->root = bt;
}
cout << bt->data << "的左孩子";
bt->lChild = PreCreateTree(); cout << bt->data << "的右边孩子";
bt->rChild = PreCreateTree();
}
return bt;
} void preOderTraversal(BinaryTreeNode<T> *bt); //先序遍历
void inOrderTraversal(BinaryTreeNode<T> *bt); //中序遍历
void postOrderTraversal(BinaryTreeNode<T> *bt);//后序遍历
void levelTraversal(BinaryTreeNode<T> *bt); //逐层遍历 private: }; template <typename T>
void BinaryTree<T>::preOderTraversal(BinaryTreeNode<T> *bt) {
if (bt)
{
cout << bt->data;
BinaryTree<T>::preOderTraversal(bt->getLeftNode());
BinaryTree<T>::preOderTraversal(bt->getRightNode());
}
} template <typename T>
void BinaryTree<T>::inOrderTraversal(BinaryTreeNode<T> *bt) {
if (bt)
{
BinaryTree<T>::inOrderTraversal(bt->getLeftNode());
cout << bt->data;
BinaryTree<T>::inOrderTraversal(bt->getRightNode());
}
} template <typename T>
void BinaryTree<T>::postOrderTraversal(BinaryTreeNode<T> *bt) {
if (bt)
{
BinaryTree<T>::postOrderTraversal(bt->getLeftNode());
BinaryTree<T>::postOrderTraversal(bt->getRightNode());
cout << bt->data;
}
} template <typename T>
void BinaryTree<T>::levelTraversal(BinaryTreeNode<T> *bt) { queue<BinaryTreeNode<T>*> que;
que.push(bt);
while (!que.empty())
{
BinaryTreeNode<T>* proot = que.front();
que.pop();
cout << proot->data; if (proot->lChild != NULL)
{
que.push(proot->lChild);//左孩子入队
}
if (proot->rChild != NULL)
{
que.push(proot->rChild);//右孩子入队
}
}
}

第三、主程序运行

 #include "pch.h"
#include <iostream>
#include "BinaryTree.h" int main()
{
//场景测试2
BinaryTree<int> btree;
btree.PreCreateTree();//先序构建二叉树
cout << "先序遍历:";
btree.preOderTraversal(btree.root); cout << endl;//先序遍历
cout << "中序遍历:";
btree.inOrderTraversal(btree.root); cout << endl;//中序遍历
cout << "后序遍历:";
btree.postOrderTraversal(btree.root); cout << endl;//后序遍历
cout << "逐层序遍历:";
btree.levelTraversal(btree.root); }

最终测试运行截图

c++ 先序构建二叉树的更多相关文章

  1. Construct Binary Tree from Preorder and Inorder Traversal(根据前序中序构建二叉树)

    根据前序中序构建二叉树. 1 / \ 2 3 / \ / \ 4 5 6 7对于上图的树来说, index: 0 1 2 3 4 5 6 先序遍历为: 6 3 7为了清晰表示,我给节点上了颜色,红色是 ...

  2. Java 重建二叉树 根据前序中序重建二叉树

    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...

  3. Construct Binary Tree from Inorder and Postorder Traversal(根据中序遍历和后序遍历构建二叉树)

    根据中序和后续遍历构建二叉树. /** * Definition for a binary tree node. * public class TreeNode { * int val; * Tree ...

  4. Tree Recovery(由先、中序列构建二叉树)

    题目来源: http://poj.org/problem?id=2255 题目描述: Description Little Valentine liked playing with binary tr ...

  5. YTU 2345: 后序遍历二叉树

    原文链接:https://www.dreamwings.cn/ytu2345/2611.html 2345: 后序遍历二叉树 时间限制: 1 Sec  内存限制: 128 MB 提交: 3  解决:  ...

  6. YTU 2346: 中序遍历二叉树

    原文链接:https://www.dreamwings.cn/ytu2346/2606.html 2346: 中序遍历二叉树 时间限制: 1 Sec  内存限制: 128 MB 提交: 12  解决: ...

  7. YTU 2344: 先序遍历二叉树

    原文链接:https://www.dreamwings.cn/ytu2344/2603.html 2344: 先序遍历二叉树 时间限制: 1 Sec  内存限制: 128 MB 提交: 4  解决:  ...

  8. Leetcode 94. Binary Tree Inorder Traversal (中序遍历二叉树)

    Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tr ...

  9. PHP递归方法实现前序、中序、后序遍历二叉树

    二叉树是每个节点最多有两个子树的树结构.通常子树被称作“左子树”(left subtree)和“右子树”(right subtree). class Node { public $value; pub ...

随机推荐

  1. [Linux] 终端设置只显示当前目录及终端美化

    1.只显示当前目录 vim ~/.bashrc 找到位置: if [ "$color_prompt" = yes ]; then PS1='${debian_chroot:+($d ...

  2. asp.net 输入框在chrome中无法关闭自动提示

    将asp:TextBox 的属性AutoCompleteType设为Disabled,希望在chrome中点击记住用户名密码后输入框不再自动提示,但不起作用. 解决方法: <asp:TextBo ...

  3. 删除rz上传失败乱码的文件

    [摘要:经过rz上传文件失利时,会发生巨细为0的治码的文件,以下 ls-l -rw-rr1rootroot4703112-1513:48???.htm 这类范例的文件可用以下敕令 find.-maxd ...

  4. GitHub https链接中输入账户和密码

    /********************************************************************** * GitHub https链接中输入账户和密码 * 说 ...

  5. 【排序】归并排序,C++实现

    原创文章,转载请注明出处! 博客文章索引地址 博客文章中代码的github地址 # 基本思想(分治法)       归并排序中, “归”代表递归的意思,即递归的将数组通过折半的方式分离为单个数组. “ ...

  6. HDU2604 Queuing 矩阵初识

    Queues and Priority Queues are data structures which are known to most computer scientists. The Queu ...

  7. KeyDown/PreviewKeyDown事件中监听Alt键按下

    一个坑 在WPF应用程序(或者其他Windows应用程序中),为了监听Alt键按下,我们可以尝试写出这样的代码: PreviewKeyDown += (s, e) => { if (e.Key ...

  8. python(十二):网络编程之ISO/OSI模型

    互联网(Internet)是依据操作系统,在计算机硬件的基础上建立起的通讯机制.它依赖于TCP/IP协议栈. 一.ISO/OSI模型 1.ISO七层模型与OSI五层模型 它们将计算机抽象成了具有层级关 ...

  9. RSA 每次公钥加密不同结果

    今天服务器端一哥们突然跑过来跟我说:我发现公钥每次加密都不同结果啊? 我说:怎么可能?不同的话,私要怎么解密和验证啊? 然后我屁颠屁颠的试了下,结果发现不论在在线RSA的还是自己公司 利用同一个明文加 ...

  10. 《DSP using MATLAB》示例Example7.4

    代码: h = [-4, 1, -1, -2, 5, 6, 5, -2, -1, 1, -4]; M = length(h); n = 0:M-1; [Hr, w, a, L] = Hr_Type1( ...