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

树的建立、深度及路径

 
阅读更多

#include <cstdlib>
#include <iostream>
#include "Tree.h"
#include "Stack.h"
using namespace std;


int main()
{
    Tree<char> tree;
    cout << "Enter each Nodes two ones a time, which are SuperNode and SubNode : "<<endl;

    tree.CreatTree();
   
    int height=tree.getHeight();
   
    cout << "The height of this tree is "<<height<<endl;
   
    cout<<endl;   
    cout << "Each path in this tree is as following :"<<endl;
   
    tree.getAllpath();
   
   
    system("PAUSE");
   
    return 0;
}

 

 

#include <iostream>
#include"Queue.h"
#include"Stack.h"
#ifndef TREE_H
#define TREE_H

using namespace std;


template<typename T>
class TreeNode
{
public:
  T element;
  TreeNode<T> * firstchild;
  TreeNode<T> * nextsibling;

  TreeNode()
  {
    firstchild = NULL;
    nextsibling = NULL;
  }

  TreeNode(T element)
  {
    this->element = element;
    firstchild = NULL;
    nextsibling = NULL;
  }
};
template < typename T >
 class Tree
 {
 public:
  Tree();
  int getSize();
  int getHeight();
  void CreatTree();
  void getAllpath();
  
 private:
  TreeNode<T> * root;
  Queue<TreeNode<T>*> queue;
  Stack<char> stack;
  int size;
  int Height(TreeNode<T> *root);
  void Allpath(TreeNode<T> *root);
};

template < typename T >
Tree<T>::Tree()
{
  root=new TreeNode<T>();
}

template < typename T >
void Tree<T>::CreatTree()
{
  char fa,ch;
  cin>>fa;
  cin>>ch;
 
  TreeNode<T> *r;
  TreeNode<T> *p;
  for( ; ch!='#' ; ){
   p =new TreeNode<T>(ch);
   queue.enqueue(p);
   if(fa=='@')  root=p;
    else
    {
      TreeNode<T>*treenode=queue.getHead();
         while(treenode->element!=fa){
              queue.dequeue();
              treenode=queue.getHead();
         };
       
        if(!(treenode->firstchild))
        {treenode->firstchild=p;
         r=p;
         size++;
        
        }
        else
        {r->nextsibling=p;
         r=p;
         size++;
       
        }
    }
    cin>>fa;cin>>ch;
  }
}

template < typename T >
int Tree<T>::getHeight()
{
  return Height(root);
}

template < typename T >
int Tree<T>::Height(TreeNode<T> *root)
{
  if(!root) return 0;
  else{
       int h1=Height(root->firstchild);
       int h2=Height(root->nextsibling);
       if(h2>(h1+1))
            return h2;
       else return h1+1;
      }
}

template < typename T >
void Tree<T>::getAllpath()
{
  Allpath(root);
}

template < typename T >
void Tree<T>::Allpath(TreeNode<T> *r)
{
  while(r){
           stack.push(r->element);
           if(!r->firstchild)
              stack.print();
           else Allpath(r->firstchild);
           char del=stack.pop();
           r=r->nextsibling;
  }
}

#endif

 

#ifndef QUEUE_H
#define QUEUE_H
#include <stdexcept>
using namespace std;

template<typename T>
class Node
{
public:
  T element;  // Element contained in the node
  Node<T> *next; // Pointer to the next node

  Node() // No-arg constructor
  {
    next = NULL;
  }

  Node(T element) // Constructor
  {
    this->element = element;
    next = NULL;
  }
};

template<typename T>
class Queue
{
public:
  Queue();
  void enqueue(T element);
  T dequeue() throw (runtime_error);
  int getSize();
  T getHead();
 
private:
 Node<T> *head, *tail;
  int size;
};

template<typename T>
Queue<T>::Queue()
{
  head = tail = NULL;
  size = 0;
}

template<typename T>
void Queue<T>::enqueue(T element)
{
   if (tail == NULL)
  {
    head = tail = new Node<T>(element);
  }
  else
  {
    tail->next = new Node<T>(element);
    tail = tail->next;
  }

  size++;
}

template<typename T>
T Queue<T>::dequeue() throw (runtime_error)
{
   if (size == 0)
   throw runtime_error("No elements in the list");
  else
  {
    Node<T> *temp = head;
    head = head->next;
    size--;
    if (head == NULL) tail = NULL;
    T element = temp->element;
    delete temp;
    return element;
  }
}

template<typename T>
int Queue<T>::getSize()
{
  return size;
}
template<typename T>
T Queue<T>::getHead()
{
  return head->element;
}
#endif

 

#ifndef STACK_H
#define STACK_H
#include <iostream>
using namespace std;

template<typename T>
class Node2
{
public:
  T element;  // Element contained in the node
  Node2<T> *next; // Pointer to the next node

  Node2() // No-arg constructor
  {
    next = NULL;
  }

  Node2(T element) // Constructor
  {
    this->element = element;
    next = NULL;
  }
};

template<typename T>
class Stack
{
public:
  Stack();
  bool empty();
  T peek();
  T push(T value);
  T pop();
  int getSize();
  void print();
private:
 Node2<T> *head, *tail;
  int size;
};

template<typename T>
Stack<T>::Stack()
{
 head = tail = NULL;
  size = 0;
}

template<typename T>
bool Stack<T>::empty()
{
  return head == NULL;
}

template<typename T>
T Stack<T>::peek()
{
   if (size == 0)
    throw runtime_error("Index out of range");
  else
    return tail->element;
}

template<typename T>
T Stack<T>::push(T element)
{
  if (tail == NULL)
  {
    head = tail = new Node2<T>(element);
  }
  else
  {
    tail->next = new Node2<T>(element);
    tail = tail->next;
  }

  size++;
  return element;
}

template<typename T>
T Stack<T>::pop()
{
 if (size == 0)
    throw runtime_error("No elements in the list");
  else if (size == 1)
  {
    Node2<T> *temp = head;
    head = tail = NULL;
    size = 0;
    T element = temp->element;
    delete temp;
    return element;
  }
  else
  {
    Node2<T> *current = head;

    for (int i = 0; i < size - 2; i++)
      current = current->next;

    Node2<T> *temp = tail;
    tail = current;
    tail->next = NULL;
    size--;
    T element = temp->element;
    delete temp;
    return element;
  }
}

template<typename T>
int Stack<T>::getSize()
{
  return size;
}

template<typename T>
void Stack<T>::print()
{
  Node2<T> *point=head;
  while(point!=NULL){
  cout<<point->element<<" ";
  point=point->next;
  }
 cout<<endl;
}
#endif

分享到:
评论

相关推荐

    建立哈夫曼树并建立文件给出每个节点的路径

    这通常通过深度优先搜索(DFS)或广度优先搜索(BFS)完成,每次访问到一个节点时,可以记录从根节点到该节点经过的路径,可以用“0”和“1”表示左分支和右分支。这样,每个节点都会有一个唯一的二进制路径,对应于...

    邻接表实现无向图的建立与遍历,最小生成树以及最短路径

    无向图是一种图数据结构,其中每条...总的来说,这个压缩包中的代码实现了一套完整的无向图处理工具,包括了图的构建、遍历以及求解最小生成树和最短路径的关键算法。这对于学习图论和算法设计是非常有价值的实践案例。

    哈夫曼树的建立(根据输入的权值,建立一棵哈夫曼树)

    在给定的描述中,我们不仅要建立哈夫曼树,还需要展示每个节点的相关信息,包括: - **结点序号**:每个节点在树中的唯一编号,通常从1开始,按深度优先搜索或广度优先搜索顺序分配。 - **双亲结点**:对于非根节点...

    C语言实现计算树的深度的方法

    树的高度或深度是从根节点到最远叶节点的最长路径上的边数。 在C语言中,我们可以使用结构体来表示树的节点。以下是一个简单的定义: ```c struct Node { int data; // 节点的值 Node *left; // 左子节点指针 ...

    采茶机器人导航避障及路径规划研究.pdf

    SLAM是移动机器人自主导航和地图构建的基石,它让机器人能够在未知环境中建立地图,并利用这个地图进行路径规划,以避开障碍物,找到通往目标地点的最优路径。 三、SLAM技术的发展 SLAM技术的发展经历了两个主要...

    数据结构课程设计:建立二叉树并求指定结点路径

    为了找到这个路径,我们需要从根节点开始进行深度优先搜索(DFS)或广度优先搜索(BFS)。在DFS中,我们可以使用递归或栈来跟踪路径;在BFS中,可以使用队列来存储每个层级的节点。一旦找到目标节点,就可以回溯路径...

    二叉树的先序扩展创建,先序、中序、后序遍历的递归、非递归算法,求树的深度

    至于树的深度,可以理解为从根节点到最远叶子节点的最长路径上边的数目。对于递归方法,我们可以从每个节点出发,分别计算左子树和右子树的深度,取较大者加1作为当前节点的深度。非递归方法通常需要遍历整个树,...

    数据结构:二叉树

    4. **深度**:节点到根节点的路径长度。 5. **高度**:树的高度定义为树中节点的最大深度。 6. **平衡二叉树**:任意两个节点的高度差不超过1的二叉树。 #### 三、二叉树的创建 给定代码中的`createtree`函数用于...

    二叉树排序树建立及平衡处理

    指向查找路径上访问的最后一个结点并返回FALSE,指针f指向T的双亲, 其初始调用值为NULL Delete_AVL(BSTree *T, TElemType e, int *shorter) 在平衡二叉排序树中删除元素值为e的结点,成功返回OK,失败返回ERROR ...

    机器人路径规划的快速扩展随机树算法综述.pdf

    单向随机树扩展方法中的一个关键问题是如何决定树的扩展方向,以快速找到通往目标的路径。而在多向随机树扩展中,一个难点是如何平衡多方向扩展产生的计算开销与路径搜索的广度。 RRT算法的未来研究方向和挑战主要...

    决策树建立、注解图、分类.zip

    在这个“决策树建立、注解图、分类.zip”压缩包中,我们很可能会找到关于如何构建决策树、如何理解和解读决策树以及如何用决策树进行分类的详细资料。 首先,我们要理解决策树的基本概念。决策树由节点和边构成,根...

    建立二叉树,前后中序遍历二叉树,求二叉树的深度

    最后,**求二叉树的深度** 是指找到从根节点到最远叶子节点的最长路径上边的数目。二叉树的深度可以通过递归计算左右子树的深度并取较大值加一得到: ```python def maxDepth(root): if root is None: return 0 ...

    c++编写的哈夫曼树的建立过程

    哈夫曼树,也称为最优二叉树或最小带权路径长度树,是一种带权路径长度最短的二叉树。它的特点是在所有可能的二叉树中,具有最小的带权路径长度。哈夫曼树的构建主要分为两步:首先创建一个哈夫曼表,然后根据表中的...

    哈夫曼树的建立与编码实验报告.pdf

    哈夫曼编码的生成是通过对哈夫曼树进行深度优先搜索(DFS)或广度优先搜索(BFS)来实现的。每个字符对应的编码是沿着从根到该字符叶节点的路径上左分支标记为0,右分支标记为1。编码长度是每个字符到达叶节点的路径...

    哈弗曼树的建立及哈弗曼编码的生成 c++实现

    4. **生成编码**:遍历哈弗曼树,通常从根节点出发,左子树代表0,右子树代表1,到达叶子节点时收集到的路径即为该字符的哈弗曼编码。可以使用深度优先搜索(DFS)或广度优先搜索(BFS)进行遍历。 5. **编码与解码...

    无向图_C语言_

    总之,这个项目涵盖了无向图的邻接表存储、深度优先搜索以及先序遍历等核心概念,是学习和实践图论及C语言编程的好例子。通过这个项目,开发者可以深入了解图的存储和遍历算法,并提升解决复杂问题的能力。

    图的深度优先搜索遍历

    图的深度优先搜索遍历(Depth-First Search, DFS)是一种在图中寻找路径的算法,常用于遍历或搜索树或图。该算法从根节点开始,沿着边向下尽可能深地搜索,直到达到叶子节点或者无法再进一步,然后回溯到上一个节点...

    树的建立与遍历

    7. **树的高度/深度**:从根节点到最远叶节点的最长路径上的边数。 树的建立通常通过编程语言实现,可以是动态创建,也可以从已有的数据结构(如数组或链表)转换而来。例如,在Python中,可以定义一个Node类来表示...

    2-3-tree-master.zip_2-3树建立

    2-3树的建立过程通常从一个空树开始。当需要插入一个新的元素时,如果当前节点是2节点且还有空间,则直接插入;如果当前节点是3节点,那么需要将该节点分裂为两个2节点,其父节点升级为3节点,新插入的元素根据大小...

Global site tag (gtag.js) - Google Analytics