`
蒙面考拉
  • 浏览: 160618 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

C++ 实现求二叉树的深度及遍利

 
阅读更多

#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;
}

分享到:
评论

相关推荐

    求二叉树的深度

    采用先序法建立一棵二叉树,设计求该二叉树的深度,二叉树的数据域类型为字符型, 扩展二叉树的叶子结点用‘#’表示,要求可以求多棵二叉树的深度,当二叉树的深度为0时程序结束。

    求二叉树深度程序谢谢捧场

    根据给定文件的信息,本文将围绕“求二叉树深度”的主题进行展开,详细介绍二叉树的概念、如何构建二叉树、以及如何计算二叉树的深度。 ### 一、二叉树概述 二叉树是一种非常重要的数据结构,在计算机科学领域有着...

    二叉树求深度

    总结来说,二叉树求深度的关键在于递归地计算每个节点的子树深度,然后比较并返回较大的那个值加1。通过这种方式,可以有效地计算出任意形状的二叉树的深度。在实际编程中,理解并掌握这种递归算法对于处理树形结构...

    C++线索二叉树类实现

    线索二叉树的实现涉及到对二叉链表的深度理解和巧妙操作。通过线索化,我们可以在不使用栈或者递归的情况下实现二叉树的遍历,这对于处理大规模数据或内存受限的环境非常有利。然而,线索二叉树增加了额外的存储开销...

    c++数据结构二叉树

    数据结构课程设计 1. 创建二叉树的链表存储结构;...6. 求二叉树的深度。 7. 设计一个算法,求二叉树中指定结点x的层数。 8. 设计一算法,求先序遍历序列中第k个结点的左右孩子。 9. 求结点x的所有祖先。

    二叉树深度_二叉树查询_二叉树深度_

    在实际应用中,二叉树深度的概念不仅用于查询,还广泛应用于其他场景,如平衡二叉树(AVL树、红黑树等)的维护,二叉搜索树的查找效率分析,以及在游戏AI中的路径搜索(如A*算法)等。理解并掌握二叉树的深度计算对...

    二叉树遍历求树叶数、深度

    数据结构二叉树遍历求树叶数及树的深度,个人作业,仅供大家参考或改进

    子树深度,完全二叉树的计算

    此外,提到的其他文件如“24点.cpp”、“算术表达式求值.cpp”、“稀疏多项式的乘法实现.cpp”、“堆排序、直接插入排序的算法比较.cpp”虽然与子树深度和完全二叉树的主题不直接相关,但它们涉及到的算法和数据结构...

    数据结构二叉树的C++实现

    7. **树的深度优先搜索(DFS)和广度优先搜索(BFS)**:二叉树的遍历可以看作是DFS的一种,BFS则常使用队列来实现。 8. **树的转换**:如将二叉树转化为链表、满二叉树转化为完全二叉树等,这些转换在某些问题中很...

    c++实现二叉树的基本功能

    本文将深入探讨如何使用C++语言来实现二叉树的基本功能,包括其构建、销毁、以及各种遍历方法。我们将讨论前序、中序和后序遍历的递归和非递归实现,同时还会涉及计算树的深度和高度。 首先,要实现二叉树,我们...

    非二叉树的C++实现

    在C++中实现非二叉树,我们需要设计一个数据结构来表示树节点,并提供一系列方法来执行基本的树操作,如插入、删除、遍历等。以下是对非二叉树C++实现的详细说明: 1. **数据结构设计** - 节点定义:创建一个类`...

    二叉树深度遍历广度遍历

    - BFS 适用于求最短路径问题(如BFS求图中两点间的最短距离)、层次遍历(如找到二叉树的最底层节点)。 5. 时间复杂度与空间复杂度: - DFS 和 BFS 的时间复杂度均为 O(n),其中 n 是树中的节点数,因为每个节点...

    C++创建二叉树及操作

    ### C++创建二叉树及操作详解 #### 一、二叉树的定义与结构 在计算机科学中,二叉树是一种重要的数据结构,每个节点最多有两个子节点,通常称作“左子节点”和“右子节点”。二叉树在计算机科学中有广泛的应用,...

    c++实现二叉树及其应用

    以上就是使用C++实现二叉树及其基本操作的方法。在实际应用中,可能还需要考虑其他功能,比如查找、插入和删除节点,以及各种优化策略以提高性能。二叉树的理论和实践是计算机科学中的重要组成部分,对理解和解决...

    c++二叉树实现代码

    - **设计目标**:通过本次实验,学生将能够掌握如何使用C++来实现二叉树的创建及其基本操作,包括遍历方法、求解树的深度等。 - **功能设计要求**:具体而言,学生需要实现以下功能: - 定义一个二叉树类型`bitree`...

    二叉树的遍历并求的深度

    请自行将#include换成stdio.h,stdlib.h头文件。 替换后即可使用。

    二叉树的叶子结点数及深度

    下面详细介绍给出的代码实现,包括定义二叉树结构、构建二叉树、遍历计算叶子结点数以及计算二叉树深度。 ##### 1. 定义二叉树结构 ```c++ struct node { char data; struct node *lchild, *rchild; } bnode; ...

    C++ 数据库二叉树的实现

    一、实验目的 1.掌握构造二叉链表树的算法。 2.掌握遍历二叉树的四种(先序、中序、后序、层序)算法(递归和非递归)算法。 3.掌握基于先序遍历...6、编写递归算法,求二叉树中以元素值为x的结点为根的子树的深度。

Global site tag (gtag.js) - Google Analytics