c++ 先序构建二叉树
二叉树首先要解决构建问题,才能考虑后续的遍历,这里贴出通过先序构建二叉树,同时包含四种二叉树的遍历方法(先序,中序,后序,逐层)
第一、定义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++ 先序构建二叉树的更多相关文章
- 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为了清晰表示,我给节点上了颜色,红色是 ...
- Java 重建二叉树 根据前序中序重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...
- Construct Binary Tree from Inorder and Postorder Traversal(根据中序遍历和后序遍历构建二叉树)
根据中序和后续遍历构建二叉树. /** * Definition for a binary tree node. * public class TreeNode { * int val; * Tree ...
- Tree Recovery(由先、中序列构建二叉树)
题目来源: http://poj.org/problem?id=2255 题目描述: Description Little Valentine liked playing with binary tr ...
- YTU 2345: 后序遍历二叉树
原文链接:https://www.dreamwings.cn/ytu2345/2611.html 2345: 后序遍历二叉树 时间限制: 1 Sec 内存限制: 128 MB 提交: 3 解决: ...
- YTU 2346: 中序遍历二叉树
原文链接:https://www.dreamwings.cn/ytu2346/2606.html 2346: 中序遍历二叉树 时间限制: 1 Sec 内存限制: 128 MB 提交: 12 解决: ...
- YTU 2344: 先序遍历二叉树
原文链接:https://www.dreamwings.cn/ytu2344/2603.html 2344: 先序遍历二叉树 时间限制: 1 Sec 内存限制: 128 MB 提交: 4 解决: ...
- Leetcode 94. Binary Tree Inorder Traversal (中序遍历二叉树)
Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tr ...
- PHP递归方法实现前序、中序、后序遍历二叉树
二叉树是每个节点最多有两个子树的树结构.通常子树被称作“左子树”(left subtree)和“右子树”(right subtree). class Node { public $value; pub ...
随机推荐
- 关于block和inline元素的float
CSS float 浮动属性 本篇主要介绍float属性:定义元素朝哪个方向浮动. 目录 1. 页面布局方式:介绍文档流.浮动层以及float属性. 2. float:left :介绍float为 l ...
- 添加courses模块
startapp courses from django.db import models from datetime import datetime # Create your models her ...
- java.sql.SQLException: Unsupported character encoding 'utf8mb4'.
四月 12, 2017 3:47:52 下午 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() fo ...
- VERIFY DATABASE 正在异常终止。 (Microsoft SQL Server,错误: 3169)
1.错误描述 标题: Microsoft SQL Server Management Studio ------------------------------ 备份介质验证失败: [文件: D:\S ...
- 【排序】归并排序,C++实现
原创文章,转载请注明出处! 博客文章索引地址 博客文章中代码的github地址 # 基本思想(分治法) 归并排序中, “归”代表递归的意思,即递归的将数组通过折半的方式分离为单个数组. “ ...
- 《DSP using MATLAB》示例Example 8.16
%% ------------------------------------------------------------------------ %% Output Info about thi ...
- Django之tag标签和filter标签
1.Django的tag常见的标签,可以做一些简单的功能 {%if%} 的使用主要用于做判断,还可以包含{%elif%} 这样的用法,最后要跟上{% endif %}.可以使用你的and,or,not ...
- SEO SEM
SEO:搜索引擎优化SEM:搜索引擎营销 SEO排名机制:搜索引擎蜘蛛 权重 算法 排名规则 搜索引擎提交入口: 1.百度搜索网站登入口 2.Google网站登入口 3.360搜索引擎登入入口 4.搜 ...
- css 常用类名
1.页面结构 容器: container 页头:header 内容:content/container 页面主体:main 页尾:footer 导航:nav 侧栏:sidebar 栏目:column ...
- [转]console.time和console.timeEnd用法
console.time和console.timeEnd这两个方法可以用来让WEB开发人员测量一个javascript脚本程序执行消耗的时间.随着WEB应用越来越重要,JavaScript的执行性能也 ...