二叉树的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 ...
随机推荐
- TCP被动打开 之 第三次握手-接收ACK
假定客户端主动打开,发送syn包到服务器,服务器创建连接请求控制块加入到队列,进入TCP_NEW_SYN_RECV 状态,发送syn+ack给客户端,并启动定时器,等待客户端回复最后一个握手ack: ...
- Mui 底部导航切换
1.建好子模板目录 2.导航代码 <nav class="mui-bar mui-bar-tab"> <a id="defaultTab" c ...
- [SQL Server 视图的创建- (create view必须是批处理中仅有的语句问题)]
当我们SQL Server在创建视图时 ,会出现"create view 必须是批处理中仅有的语句"这个语法错误提示 ,实际上这本身没什么错! 因为create view 必须是批 ...
- RGB颜色透明度转换
100% — FF95% — F290% — E685% — D980% — CC75% — BF70% — B365% — A660% — 9955% — 8C50% — 8045% — 7340% ...
- 开源的图片查看库之PhotoView
PhotoView是一个开源的图片查看库,可以实现图片的浏览,手势放大缩小等操作,以及支持在ViewPager中翻页浏览图片等功能.PhotoView使用简单,还可以对缩放模式进行设置, 其开源地址为 ...
- python 连接oracle数据库:cx_Oracle
注意:64位操作系统必须安装64位oracle客户端,否则会连接报错 安装第三方库:cx_Oracle 一.连接数据库的三种方式: 1.cx_Oracle.connect('账号/密码@ip:端口/数 ...
- c++ qsort函数应用
C++ qsort在"iostream" c在头文件stdlib.h中,strcmp在string.h中.下列例子默认从小到大排序即(a>b返回>0),反之从小到大排序 ...
- <li>元素的排序
要点: getElementsByTagName("li")返回的是HTMLCollection对象,这个对象不同于Array对象,不能使用sort()方法进行排序~ 下面方法的要 ...
- ApiDoc 后端接口注释文档的使用
前端和后端注释文档生成 前端和后端的 函数及api 说明文档生成总结,持续更新中 by Qzx 参考网址 jsDoc - 中文说明 jsDoc 使用教程 后台接口文档生成器 - APIDOC官网 ap ...
- python-Web-数据库-Redis
概述: >>>安装: >>>数据类型: string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合) &g ...