二叉树的C++实现
这是去年的内容,之前放在github的一个被遗忘的reporsity里面,今天看到了就拿出来
#include<iostream>
#include<string>
using namespace std;
/*
question#2:The creation of BinaryTree
goal:
1.建立二叉树(通过先序序列作为输入)
2.实现中序遍历和层序遍历、元素查找
3.实现、解释
*/
/*先定义队列,以实现二叉树的层序遍历
使用链队列,以达到不预先定义队列大小的效果*/
template <typename Type>class LinkQueue;
template <typename Type>
class LinkQueueNode {
friend class LinkQueue<Type>;
public:
LinkQueueNode(Type &e, LinkQueueNode<Type>*p = NULL) :elem(e), next(p) {};
private:
Type elem;
LinkQueueNode<Type>*next;
};
template<typename Type>
class LinkQueue {
public:
LinkQueue() :front(NULL), rear(NULL) {};
~LinkQueue();
int IsEmpty()const { return front == NULL; };
void LinkQueueClear();
int LinkQueueLength()const;
Type GetFront();
void InQueue(Type&e);
Type OutQueue();
private:
LinkQueueNode<Type>*front, *rear;
};
template <typename Type>
LinkQueue<Type>::~LinkQueue() {
LinkQueueNode<Type>*p;
while (front != NULL) {
p = front;
front = front->next;
delete p;
}
};
template <typename Type>
void LinkQueue<Type>::InQueue(Type &e) {
if (front == NULL)front = rear = new LinkQueueNode<Type>(e, NULL);
else
rear = rear->next = new LinkQueueNode<Type>(e, NULL);
};
template <typename Type>
Type LinkQueue<Type>::OutQueue() {
if (IsEmpty())
{
cout << "链队列为空!" << endl;
exit(0);
}
LinkQueueNode<Type>*p = front;
Type e = p->elem;
front = front->next;
if (front == NULL)rear = NULL;
delete p;
return e;
};
template <typename Type>
Type LinkQueue<Type>::GetFront() {
if (IsEmpty()) {
cout << "链队列为空!" << endl;
exit(0);
}
else
return front->elem;
};
template <typename Type>
int LinkQueue<Type>::LinkQueueLength()const {
LinkQueueNode<Type>*p = front;
int i = 0;
while (p) {
i++;
p = p->next;
}
return i;
};
template<typename T>class BinaryTree;
template<typename T>
class BinaryTreeNode {//define the node of binary tree
friend class BinaryTree<T>;
//friend class BinarySearchTree<T>;
private:
T data;
BinaryTreeNode<T>* left;
BinaryTreeNode<T>* right;
public:
BinaryTreeNode();
BinaryTreeNode<T>(const T&ele) :data(ele) {};
BinaryTreeNode<T>(const T&ele, BinaryTreeNode<T>*l, BinaryTreeNode<T>*r) :data(ele), left(l), right(r) {};
~BinaryTreeNode() {};
T value()const { return data; }
BinaryTreeNode<T>& operator=(const BinaryTreeNode<T>&Node) { this = Node; };
BinaryTreeNode<T>*leftchild()const { return left; };
BinaryTreeNode<T>*rightchild()const { return right; };
void setLeftchild(BinaryTreeNode<T>*);
void setRightchild(BinaryTreeNode<T>*);
void setValue(const T&val);
bool isLeaf()const;
};
template<typename T>
class BinaryTree {//define the binary tree
protected:
BinaryTreeNode<T>*root;
public:
BinaryTree() {
root = NULL;
}
BinaryTree(BinaryTreeNode<T>*r) { root = r; }
//~BinaryTree() { DeleteBinaryTree(root); };
//bool isEmpty()const;
void visit(const T&data) { cout << data << ' '; };
BinaryTreeNode<T>*&Root() { return root; };
/*BinaryTreeNode<T>*Parent(BinaryTreeNode<T>*current);
BinaryTreeNode<T>*LeftSibling(BinaryTreeNode<T>*current);
BinaryTreeNode<T>*RightSibling(BinaryTreeNode<T>*current);*/
void CreateTree(const T&data, BinaryTree<T>&leftTree, BinaryTree<T>&rightTree);
void CreateTree(BinaryTreeNode<T>*&r);
void DeleteBinaryTree(BinaryTreeNode<T>*root);
//void PreOrder(BinaryTreeNode<T>*root);
void InOrder(BinaryTreeNode<T>*root);
/*void PostOrder(BinaryTreeNode<T>*root);
void PreOrderWithoutRecusion(BinaryTreeNode<T>*root);
void InOrderWithoutRecusion(BinaryTreeNode<T>*root);
void PostOrderWithoutRecusion(BinaryTreeNode<T>*root);*/
void LevelOrder(BinaryTreeNode<T>*root);
bool Search(BinaryTreeNode<T>*root,T&data);
};
template<typename T>
/*利用用户输入的先序遍历序列来初始化二叉树*/
void BinaryTree<T>::CreateTree(BinaryTreeNode<T>*& r)
{
char ch;
cin >> ch;
if (ch == '#')r = NULL;
else {
r = new BinaryTreeNode<T>(ch);
CreateTree(r->left);
CreateTree(r->right);
}
};
template<typename T>
bool BinaryTree<T>::Search(BinaryTreeNode<T>*root,T &data)
{
/*前序遍历,递归进行元素的搜索*/
int flag = 0;
if (root == NULL)
return 0;
if (root->data == data)
{
flag = 1;
return flag;
}
flag=flag+Search(root->left, data);
flag=flag+Search(root->right, data);
return flag;
};
template<typename T>
void BinaryTree<T>::InOrder(BinaryTreeNode<T>*root)
{
/*二叉树的中序遍历*/
if (root == NULL)return;
InOrder(root->left);
visit(root->data);
InOrder(root->right);
};
template<typename T>
void BinaryTree<T>::LevelOrder(BinaryTreeNode<T>*root)
{
/*二叉树的层序遍历*/
LinkQueue<BinaryTreeNode<T>*>tQueue;//链队列,节点类型为二叉树节点指针类型
BinaryTreeNode<T>*pointer = root;
if (pointer)tQueue.InQueue(pointer);
while (!tQueue.IsEmpty()) {
pointer = tQueue.GetFront();
tQueue.OutQueue();
visit(pointer->value());
if (pointer->leftchild() != NULL)
tQueue.InQueue(pointer->left);
if (pointer->rightchild() != NULL)
tQueue.InQueue(pointer->right);
}
};
int main()
{
char te ='A';
BinaryTree<char> test;//注意,用模板来创建对象时不使用new语句!!!
//BinaryTreeNode<char>* temp;
//temp = test.Root();
test.CreateTree(test.Root());//建立二叉树(通过先序序列作为输入)
test.InOrder(test.Root());//中序遍历
test.LevelOrder(test.Root());//层序遍历
if (test.Search(test.Root(), te))
cout << "True" << endl;
else
cout << "False" << endl;
return 0;
}
二叉树的C++实现的更多相关文章
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- 二叉树的递归实现(java)
这里演示的二叉树为3层. 递归实现,先构造出一个root节点,先判断左子节点是否为空,为空则构造左子节点,否则进入下一步判断右子节点是否为空,为空则构造右子节点. 利用层数控制迭代次数. 依次递归第二 ...
- c 二叉树的使用
简单的通过一个寻找嫌疑人的小程序 来演示二叉树的使用 #include <stdio.h> #include <stdlib.h> #include <string.h& ...
- Java 二叉树遍历右视图-LeetCode199
题目如下: 题目给出的例子不太好,容易让人误解成不断顺着右节点访问就好了,但是题目意思并不是这样. 换成通俗的意思:按层遍历二叉树,输出每层的最右端结点. 这就明白时一道二叉树层序遍历的问题,用一个队 ...
- 数据结构:二叉树 基于list实现(python版)
基于python的list实现二叉树 #!/usr/bin/env python # -*- coding:utf-8 -*- class BinTreeValueError(ValueError): ...
- [LeetCode] Path Sum III 二叉树的路径和之三
You are given a binary tree in which each node contains an integer value. Find the number of paths t ...
- [LeetCode] Find Leaves of Binary Tree 找二叉树的叶节点
Given a binary tree, find all leaves and then remove those leaves. Then repeat the previous steps un ...
- [LeetCode] Verify Preorder Serialization of a Binary Tree 验证二叉树的先序序列化
One way to serialize a binary tree is to use pre-oder traversal. When we encounter a non-null node, ...
- [LeetCode] Binary Tree Vertical Order Traversal 二叉树的竖直遍历
Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ...
- [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列
Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...
随机推荐
- HearthBuddy的狂野和休闲模式来回切换
表现1 配置是标准,休闲模式 然后一直重复提示 select desire deck select causal mode 表现2 配置是狂野,休闲模式 然后一直提示 切换到狂野 切换到标准 把模式切 ...
- PHP AJAX返回 "TEXT"
例子:通过AJAX间接访问数据库,查出Nation表显示在页面上,并添加删除按钮 //首先在外层添加一个按钮,并造好表头 <div><input type="button& ...
- Nginx配置文件详细说明 (转)
Nginx配置文件详细说明 原文链接:http://www.cnblogs.com/Joans/p/4386556.html 在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收 ...
- java 百度地图判断两点距离2
package baiduApi; public class BaiDuMap { static double DEF_PI = 3.14159265359; // PI static double ...
- C# lock 为什么要设置成只读
首先给出MSDN的定义: lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.这是通过在代码块运行期间为给定对象获取互斥锁来实现的. 先来看看执行过程,代码示例如下: 假设线程A先执行, ...
- django中使用mysql数据库
django连接mysql 安装MySQL 1 linux: apt install mysql-server apt install mysql-client mysql_secure_instal ...
- Ubuntu 16.04 安装 google 输入法
Ubuntu 16.04 安装 google 输入法 在命令行中运行:’sudo apt install fcitx-googlepinyin’ 在 system setting > Langu ...
- python-Web-django-图片上传
建路由 创建方法 渲染页面 下载plupload插件.将插件放在项目根目录下的static下 写页面,引入js,写html 这个容器:放上传的图片 当上传后,需要ul里放3要素: 元素1:隐藏Inpu ...
- 自定义 filter simple_tag inclusion_tag 总结
在已经注册的app下创建templatetags的python包 在包内创建py文件 my_tags.py 在py文件中写代码: from django import template registe ...
- Leetcode之广度优先搜索(BFS)专题-994. 腐烂的橘子(Rotting Oranges)
Leetcode之广度优先搜索(BFS)专题-994. 腐烂的橘子(Rotting Oranges) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ar ...