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

第一、定义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. Git 之 问题集锦

    准备:远程仓库名:origin     远程分支:master.tt      本地分支:master.test 1. error: src refspec *** does not match an ...

  2. 从JDK源码角度看Boolean

    Java的Boolean类主要作用就是对基本类型boolean进行封装,提供了一些处理boolean类型的方法,比如String类型和boolean类型的转换. 主要实现源码如下: public fi ...

  3. RxJava 1.x 笔记:组合型操作符

    最近去检查眼睛,发现度数又涨了,唉,各位猿多注意保护自己的眼睛吧! 前面学了 RxJava 的三种关键操作符: 创建型操作符 过滤型操作符 变换型操作符 读完本文你将了解第四种(组合型操作符): 组合 ...

  4. [OpenCV笔记]0.OpenCV中显示多张图像

    摘要 本文主要介绍OpenCV中同时显示多张IplImage图像的方法(C++形式的多图显示需要修改,用vector<Mat>可能比较方便),有点类似MATLAB中的subplot,只是暂 ...

  5. querySelector.. 方法相比 getElementsBy..

    querySelectorAll 返回的是一个 Static Node List,而 getElementsBy 系列的返回的是一个 Live Node List. 看看下面这个经典的例子 [5]: ...

  6. LOJ2321. 「清华集训 2017」无限之环【费用流】

    LINK 很好的一道网络里题 首先想插头DP的还是出门左转10分代码吧 然后考虑怎么网络流 首先要保证没有漏水 也就是说每个接口一定要有对应的接口 那么发现每个点只有可能和上下左右四个点产生联通关系 ...

  7. BZOJ4128 Matrix 【BSGS】

    BZOJ4128 Matrix Description 给定矩阵A,B和模数p,求最小的x满足 A^x = B (mod p) Input 第一行两个整数n和p,表示矩阵的阶和模数,接下来一个n * ...

  8. 20179223《Linux内核原理与分析》第十周学习笔记

    课本第17.19和20章内容学习 关于设备驱动和设备管理,Linux主要有四种内核成分 设备类型:在所有Unix系统中为了统一普通设备的操作所采用的分类. 模块:Linux内核中用于按需加载和卸载目标 ...

  9. 使用python处理selenium中的css_selector定位元素的模糊匹配问题

    # 匹配id,先指定一个html标签,然后加上“#”符号,再加上id的属性值 self.driver.find_element_by_css_selector('div#ID').click() # ...

  10. jdbcTemplate的一些常用方法

    前言 最近的项目中由于只进行查询,所以使用了jdbcTemplate来直接操作sql进行持久层的操作,初次接触jdbcTemplate,从最开始的什么都不知道到现在基本方法都大致知道什么意思,特此记录 ...