#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
发表评论
-
析构函数为虚函数的原因
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、编程实现一个单链表的建立/测长/打印。 ...
相关推荐
这通常通过深度优先搜索(DFS)或广度优先搜索(BFS)完成,每次访问到一个节点时,可以记录从根节点到该节点经过的路径,可以用“0”和“1”表示左分支和右分支。这样,每个节点都会有一个唯一的二进制路径,对应于...
无向图是一种图数据结构,其中每条...总的来说,这个压缩包中的代码实现了一套完整的无向图处理工具,包括了图的构建、遍历以及求解最小生成树和最短路径的关键算法。这对于学习图论和算法设计是非常有价值的实践案例。
在给定的描述中,我们不仅要建立哈夫曼树,还需要展示每个节点的相关信息,包括: - **结点序号**:每个节点在树中的唯一编号,通常从1开始,按深度优先搜索或广度优先搜索顺序分配。 - **双亲结点**:对于非根节点...
树的高度或深度是从根节点到最远叶节点的最长路径上的边数。 在C语言中,我们可以使用结构体来表示树的节点。以下是一个简单的定义: ```c struct Node { int data; // 节点的值 Node *left; // 左子节点指针 ...
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 ...
单向随机树扩展方法中的一个关键问题是如何决定树的扩展方向,以快速找到通往目标的路径。而在多向随机树扩展中,一个难点是如何平衡多方向扩展产生的计算开销与路径搜索的广度。 RRT算法的未来研究方向和挑战主要...
在这个“决策树建立、注解图、分类.zip”压缩包中,我们很可能会找到关于如何构建决策树、如何理解和解读决策树以及如何用决策树进行分类的详细资料。 首先,我们要理解决策树的基本概念。决策树由节点和边构成,根...
最后,**求二叉树的深度** 是指找到从根节点到最远叶子节点的最长路径上边的数目。二叉树的深度可以通过递归计算左右子树的深度并取较大值加一得到: ```python def maxDepth(root): if root is None: return 0 ...
哈夫曼树,也称为最优二叉树或最小带权路径长度树,是一种带权路径长度最短的二叉树。它的特点是在所有可能的二叉树中,具有最小的带权路径长度。哈夫曼树的构建主要分为两步:首先创建一个哈夫曼表,然后根据表中的...
哈夫曼编码的生成是通过对哈夫曼树进行深度优先搜索(DFS)或广度优先搜索(BFS)来实现的。每个字符对应的编码是沿着从根到该字符叶节点的路径上左分支标记为0,右分支标记为1。编码长度是每个字符到达叶节点的路径...
4. **生成编码**:遍历哈弗曼树,通常从根节点出发,左子树代表0,右子树代表1,到达叶子节点时收集到的路径即为该字符的哈弗曼编码。可以使用深度优先搜索(DFS)或广度优先搜索(BFS)进行遍历。 5. **编码与解码...
总之,这个项目涵盖了无向图的邻接表存储、深度优先搜索以及先序遍历等核心概念,是学习和实践图论及C语言编程的好例子。通过这个项目,开发者可以深入了解图的存储和遍历算法,并提升解决复杂问题的能力。
图的深度优先搜索遍历(Depth-First Search, DFS)是一种在图中寻找路径的算法,常用于遍历或搜索树或图。该算法从根节点开始,沿着边向下尽可能深地搜索,直到达到叶子节点或者无法再进一步,然后回溯到上一个节点...
7. **树的高度/深度**:从根节点到最远叶节点的最长路径上的边数。 树的建立通常通过编程语言实现,可以是动态创建,也可以从已有的数据结构(如数组或链表)转换而来。例如,在Python中,可以定义一个Node类来表示...
2-3树的建立过程通常从一个空树开始。当需要插入一个新的元素时,如果当前节点是2节点且还有空间,则直接插入;如果当前节点是3节点,那么需要将该节点分裂为两个2节点,其父节点升级为3节点,新插入的元素根据大小...