#include <iostream>
#include <deque>
#include <stack>
using namespace std;
struct BSTNode
{
int data;
BSTNode * LChild,* RChild;
};
class BST
{
private:
BSTNode *T;
public:
~BST();
BSTNode * GetRoot();
void BSTCreate();
void BSTInsert(BSTNode *);
int BSTDepth(BSTNode *);//求树的深度 递归
void Depth();//树的深度 非递归
void BSTBFS();//广度优先遍历
void PreOrder(BSTNode *);//递归 前序遍历
void BSTPre();//前序遍历 非递归
void InOrder(BSTNode *);//递归 中序遍历
void BSTIn();//中序遍历 非递归
void PostOrder(BSTNode *);// 递归 后续遍历
void BSTPost();//后续遍历 双栈法
void Post();//后序遍历 单栈
void BSTSearch();//查找 递归算法
BSTNode * Search(BSTNode *,int);
};
BST::~BST()
{
deque<BSTNode *> de;
BSTNode *p=T;
if (p)
{
if(p->LChild)
de.push_back(p->LChild);
if(p->RChild)
de.push_back(p->RChild);
delete p;
while (!de.empty())
{
p=de.front();
de.pop_front();
if(p->LChild)
de.push_back(p->LChild);
if(p->RChild)
de.push_back(p->RChild);
delete p;
}
}
}
BSTNode * BST::GetRoot()
{
return T;
}
void BST::BSTInsert(BSTNode *s )
{
BSTNode *f=T;
BSTNode *p=T;
while (p)
{
f=p;
if(s->data<p->data)
p=p->LChild;
else
p=p->RChild;
}
if(T==NULL)
T=s;
else
if(s->data<f->data)
f->LChild=s;
else
f->RChild=s;
}
void BST::BSTCreate()
{
T=NULL;
int data;
BSTNode *s;
cout<<"请输入节点值并以0作为结束标志,创建一个二叉排序树"<<endl;
cin>>data;
while(data)
{
s=new BSTNode;
s->LChild=s->RChild=NULL;
s->data=data;
BSTInsert(s);
cout<<"请输入下一个节点的值:"<<endl;
cin>>data;
}
}
int BST::BSTDepth(BSTNode *p)
{
if(p)
{
int left=BSTDepth(p->LChild);
int right=BSTDepth(p->RChild);
if(left>right)
return left+1;
else
return right+1;
}
return 0;
}
void BST::Depth()
{
BSTNode * store[50];
memset(store,0,50);
int length=0;
int depth=0;
stack<BSTNode *> st;
if (T)
{
st.push(T);
while (!st.empty())
{
depth++;
length=0;
while (!st.empty())
{
BSTNode * p=st.top();
st.pop();
if (p->LChild)
store[length++]=p->LChild;
if (p->RChild)
store[length++]=p->RChild;
}
for (int i=0;i<length;i++)
st.push(store[i]);
}
cout<<"树的深度为:"<<depth<<endl;
}
else
cout<<"还未创建树!!"<<endl;
}
void BST::BSTBFS()
{
cout<<"广度优先遍历"<<endl;
deque<BSTNode *> de;
BSTNode *p=T;
de.push_back(p);
while (!de.empty())
{
p=de.front();
cout<<p->data<<"--->";
de.pop_front();
if (p->LChild)
de.push_back(p->LChild);
if(p->RChild)
de.push_back(p->RChild);
}
cout<<endl;
}
void BST::PreOrder(BSTNode * p)
{
if(p)
{
cout<<p->data<<"--->";
PreOrder(p->LChild);
PreOrder(p->RChild);
}
}
void BST::BSTPre()
{
cout<<"前序遍历 非递归"<<endl;
stack<BSTNode *> st;
st.push(T);
while(!st.empty())
{
BSTNode *P=st.top();
st.pop();
cout<<P->data<<"--->";
if (P->RChild)
st.push(P->RChild);
if(P->LChild)
st.push(P->LChild);
}
cout<<endl;
}
void BST::InOrder(BSTNode * p)
{
if(p)
{
InOrder(p->LChild);
cout<<p->data<<"--->";
InOrder(p->RChild);
}
}
void BST::BSTIn()
{
cout<<"中序遍历 非递归"<<endl;
stack<BSTNode *>st;
st.push(T);
while (!st.empty())
{
BSTNode *p=st.top();
while (p->LChild)
{
p=p->LChild;
st.push(p);
}
while (!st.empty())
{
BSTNode *q=st.top();
st.pop();
cout<<q->data<<"--->";
if(q->RChild)
{
q=q->RChild;
st.push(q);
break;
}
}
}
cout<<endl;
}
void BST::PostOrder(BSTNode * p)
{
if(p)
{
PostOrder(p->LChild);
PostOrder(p->RChild);
cout<<p->data<<"--->";
}
}
void BST::BSTPost()
{
cout<<"后序遍历 非递归"<<endl;
stack<BSTNode*> st2;
stack<BSTNode *> st;
st.push(T);
while(!st.empty())
{
BSTNode *P=st.top();
st.pop();
st2.push(P);
if(P->LChild)
st.push(P->LChild);
if (P->RChild)
st.push(P->RChild);
}
while (!st2.empty())
{
BSTNode *q=st2.top();
st2.pop();
cout<<q->data<<"---->";
}
cout<<endl;
}
void BST::Post()
{
cout<<"后续遍历 非递归"<<endl;
stack<BSTNode *>st;
st.push(T);
while (!st.empty())
{
BSTNode *p=st.top();
while (p->LChild||p->RChild)
{
if (p->LChild)
p=p->LChild;
else
p=p->RChild;
st.push(p);
}
while (!st.empty())
{
BSTNode *q=st.top();
st.pop();
if(!st.empty())
{
BSTNode *f=st.top();
cout<<q->data<<"--->";
if (q==f->LChild)
{
if (f->RChild)
{
st.push(f->RChild);
break;
}
}
}
else
cout<<q->data<<endl;
}
}
}
BSTNode * BST::Search(BSTNode *p,int x)
{
if(p==NULL||p->data==x)
return p;
else if(x<p->data)
return Search(p->LChild,x);
else
return Search(p->RChild,x);
}
void BST::BSTSearch()
{
int key;
cout<<"请输入所要查找结点的关键字:"<<endl;
cin>>key;
BSTNode * p=Search(T,key);
if (p)
{
cout<<"查找结点的数据为:"<<p->data;
}
else
cout<<"所查找的节点不存在!"<<endl;
}
int main()
{
BST bst;
bst.BSTCreate();
cout<<"树的深度为:"<<bst.BSTDepth(bst.GetRoot())<<endl;
bst.Depth();
//bst.PreOrder(bst.GetRoot());
//bst.InOrder(bst.GetRoot());
//bst.PostOrder(bst.GetRoot());
//bst.BSTBFS();
//bst.BSTPre();
//bst.BSTIn();
//bst.BSTPost();
//bst.Post();
//bst.BSTSearch();
return 0;
}
发表评论
-
析构函数为虚函数的原因
2012-09-09 11:42 832我们知道,用C++开发的时候,用来做基类的类的析构函数 ... -
hash的应用
2012-08-31 23:02 962第一部分为一道百度面试题Top K算法的详解;第二部分为关 ... -
微软智力题
2012-08-29 19:59 567第一组1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有 ... -
C++不能被继承的类
2012-08-27 20:16 1059一个类不能被继承, ... -
括号对齐问题
2012-08-27 10:47 1410解法一:左右括号成一对则抵消 可以 ... -
树的遍历
2012-08-19 10:43 719/****************************** ... -
堆排序
2012-08-16 14:24 884堆:(二叉)堆数据结构是一种数组对象。它可以被视为一棵完全 ... -
多态赋值
2012-08-14 16:16 832#include <iostream> usi ... -
static变量与static函数(转)
2012-08-13 10:15 746一、 static 变量 static变量大致分为三种用法 ... -
不用sizeof判断16位32位
2012-08-10 15:21 1704用C++写个程序,如何判断一个操作系统是16位还是3 ... -
找出连续最长的数字串(百度面试)
2012-08-09 15:15 1146int maxContinuNum(const char*in ... -
顺序栈和链栈
2012-08-06 10:01 800顺序栈:话不多说直接上代码 #include ... -
队列的数组实现和链表实现
2012-08-05 16:20 1026话不多少,数组实现上代码: #include<i ... -
KMP算法详解
2012-08-02 21:40 888KMP算法: 是在一个“主文本字符串” ... -
字符串的最长连续重复子串
2012-08-01 15:05 9780两种方法: 循环两次寻找最长的子串: <方法一> ... -
寻找一个字符串连续出现最多的子串的方法(转)
2012-07-31 21:19 986算法描述首先获得后缀数组,然后1.第一行第一个字符a,与第二行 ... -
字符串的循环移位
2012-07-31 16:52 975假设字符串:abcdefg 左循环两位:cdefgab 右 ... -
一次谷歌面试趣事(转)
2012-07-31 15:26 767很多年前我进入硅谷 ... -
约瑟夫环问题(循环链表)
2012-07-30 21:31 1291题目描述:n只猴子要选大王,选举方法如下:所有猴子按 1, ... -
面试之单链表
2012-07-30 20:18 7281、编程实现一个单链表的建立/测长/打印。 ...
相关推荐
采用先序法建立一棵二叉树,设计求该二叉树的深度,二叉树的数据域类型为字符型, 扩展二叉树的叶子结点用‘#’表示,要求可以求多棵二叉树的深度,当二叉树的深度为0时程序结束。
根据给定文件的信息,本文将围绕“求二叉树深度”的主题进行展开,详细介绍二叉树的概念、如何构建二叉树、以及如何计算二叉树的深度。 ### 一、二叉树概述 二叉树是一种非常重要的数据结构,在计算机科学领域有着...
总结来说,二叉树求深度的关键在于递归地计算每个节点的子树深度,然后比较并返回较大的那个值加1。通过这种方式,可以有效地计算出任意形状的二叉树的深度。在实际编程中,理解并掌握这种递归算法对于处理树形结构...
线索二叉树的实现涉及到对二叉链表的深度理解和巧妙操作。通过线索化,我们可以在不使用栈或者递归的情况下实现二叉树的遍历,这对于处理大规模数据或内存受限的环境非常有利。然而,线索二叉树增加了额外的存储开销...
数据结构课程设计 1. 创建二叉树的链表存储结构;...6. 求二叉树的深度。 7. 设计一个算法,求二叉树中指定结点x的层数。 8. 设计一算法,求先序遍历序列中第k个结点的左右孩子。 9. 求结点x的所有祖先。
在实际应用中,二叉树深度的概念不仅用于查询,还广泛应用于其他场景,如平衡二叉树(AVL树、红黑树等)的维护,二叉搜索树的查找效率分析,以及在游戏AI中的路径搜索(如A*算法)等。理解并掌握二叉树的深度计算对...
数据结构二叉树遍历求树叶数及树的深度,个人作业,仅供大家参考或改进
此外,提到的其他文件如“24点.cpp”、“算术表达式求值.cpp”、“稀疏多项式的乘法实现.cpp”、“堆排序、直接插入排序的算法比较.cpp”虽然与子树深度和完全二叉树的主题不直接相关,但它们涉及到的算法和数据结构...
7. **树的深度优先搜索(DFS)和广度优先搜索(BFS)**:二叉树的遍历可以看作是DFS的一种,BFS则常使用队列来实现。 8. **树的转换**:如将二叉树转化为链表、满二叉树转化为完全二叉树等,这些转换在某些问题中很...
本文将深入探讨如何使用C++语言来实现二叉树的基本功能,包括其构建、销毁、以及各种遍历方法。我们将讨论前序、中序和后序遍历的递归和非递归实现,同时还会涉及计算树的深度和高度。 首先,要实现二叉树,我们...
在C++中实现非二叉树,我们需要设计一个数据结构来表示树节点,并提供一系列方法来执行基本的树操作,如插入、删除、遍历等。以下是对非二叉树C++实现的详细说明: 1. **数据结构设计** - 节点定义:创建一个类`...
- BFS 适用于求最短路径问题(如BFS求图中两点间的最短距离)、层次遍历(如找到二叉树的最底层节点)。 5. 时间复杂度与空间复杂度: - DFS 和 BFS 的时间复杂度均为 O(n),其中 n 是树中的节点数,因为每个节点...
### C++创建二叉树及操作详解 #### 一、二叉树的定义与结构 在计算机科学中,二叉树是一种重要的数据结构,每个节点最多有两个子节点,通常称作“左子节点”和“右子节点”。二叉树在计算机科学中有广泛的应用,...
以上就是使用C++实现二叉树及其基本操作的方法。在实际应用中,可能还需要考虑其他功能,比如查找、插入和删除节点,以及各种优化策略以提高性能。二叉树的理论和实践是计算机科学中的重要组成部分,对理解和解决...
- **设计目标**:通过本次实验,学生将能够掌握如何使用C++来实现二叉树的创建及其基本操作,包括遍历方法、求解树的深度等。 - **功能设计要求**:具体而言,学生需要实现以下功能: - 定义一个二叉树类型`bitree`...
请自行将#include换成stdio.h,stdlib.h头文件。 替换后即可使用。
下面详细介绍给出的代码实现,包括定义二叉树结构、构建二叉树、遍历计算叶子结点数以及计算二叉树深度。 ##### 1. 定义二叉树结构 ```c++ struct node { char data; struct node *lchild, *rchild; } bnode; ...
一、实验目的 1.掌握构造二叉链表树的算法。 2.掌握遍历二叉树的四种(先序、中序、后序、层序)算法(递归和非递归)算法。 3.掌握基于先序遍历...6、编写递归算法,求二叉树中以元素值为x的结点为根的子树的深度。