二叉树的查找:
#include<iostream>
#include"DoubleNode.h" //双链表结点类
#include"SeqStack.h" //顺序栈
#include"LinkedStack.h" //链式栈
#include"SeqQueue.h" //顺序循环队列
using namespace std;
template <class T>
class BinaryTree // 二叉树类
{
public:
DoubleNode<T> *root; //指向根结点
BinaryTree(); //构造空二叉树
BinaryTree(T prelist [],int n); //标明空子树的先根序列构造一棵二叉树
BinaryTree(T prelist [],T inlist [],int n); //先根和中根序列构造二叉树
~BinaryTree();
bool IsEmpty(); //判断是否是空二叉树
int Count(); //返回结点个数
int Height(); //返回二叉树的高度
DoubleNode<T> *Search(T value); //查找首次出现值为value的结点
DoubleNode<T> *GetParent(DoubleNode<T> *node); //返回node结点的双亲结点
void preRoot(); //先根次序遍历二叉树
void midRoot(); //中根次序遍历二叉树
void postRoot(); //后根次序遍历二叉树
DoubleNode<T> *Insert(DoubleNode<T> *p, T value,bool priorChild = true);//插入value作为P结点的孩子
void Remove(DoubleNode<T> * p,bool priorChild = true); //删除p结点的左或右子树
void PrintGList(); //以广义表输出二叉树
void preRootTraverse(); // 先根次序遍历二叉树的非递归算法
void midRootTraverse(); // 中根次序遍历二叉树的非递归算法
void LevelOrder(); //按层次遍历二叉树
private:
void Destroy (DoubleNode<T> *p); //撤销二叉树
int Count(DoubleNode<T> *p); //返回以P结点为根的子树结点个数
int Height(DoubleNode<T> *p); //返回以P结点为根的子树结点的高度
DoubleNode<T>*Search (DoubleNode<T> *p, T value); //在以p为根的子树中查找首次出现的值为value的结点
DoublenNode<T> *GetParent (DoubleNode<T> *p, DoubleNode<T> *node); // p为根的子树中查找并返回首次出现的值为value的结点
void preRoot(DoubleNode<T> *p); //先跟次序遍历以p结点为根的子树
void midtRoot(DoubleNode<T> *p); //中根次序遍历以p结点为根的子树
void postRoot(DoubleNode<T> *p); //后根次序遍历以P结点为根的子树
DoubleNode<T> *creat(T prelist[],int n,int &i); //以标明空子树的先根遍历序列创建子树
DoubleNode<T> *creat(T prelist[],T inlist[],int preStart, int inStart,int n); //以先根和中根序列创建一棵子树
void PrintGList (DoubleNode<T> *p); //以广义表表示输出以p结点为根的子树
};
template <class T>
BinaryTree<T>::BinaryTree() //构造空二叉树
{