二叉树ADT,周游二叉树,递归非递归,求节点的父节点,兄弟节点
来源:互联网 发布:淘宝快递一直显示揽件 编辑:程序博客网 时间:2024/05/28 05:15
#pragma once#include "BinaryTreeNode.h"#include<stack>enum Tags{Left,Right};template<class T>class StackElem{public:BinaryTreeNode<T>* pointer;Tags tag;};template <class T>class BinaryTree{public:BinaryTree(){root=NULL;};~BinaryTree(){};BinaryTreeNode<T>* Root(){return root;};void createTree(const T& info,BinaryTree<T>& left,BinaryTree<T>& right);bool isEmpty()const;//先序遍历递归void preOrder(BinaryTreeNode<T>* current);//中序遍历递归void inOrder(BinaryTreeNode<T>* current);//后序遍历递归void postOrder(BinaryTreeNode<T>* current);void Visit(T value){cout<<value;};//先序遍历非递归void preOrderWithoutRec(BinaryTreeNode<T>* current);//中序遍历非递归void inOrderWithoutRec(BinaryTreeNode<T>* current);//后序遍历非递归void postOrderWithoutRec(BinaryTreeNode<T>* current);//寻找父节点BinaryTreeNode<T>* parent(BinaryTreeNode<T>* current);//寻找左兄弟BinaryTreeNode<T>* leftSibling(BinaryTreeNode<T>* current);//寻找右兄弟BinaryTreeNode<T>* rightSibling(BinaryTreeNode<T>* current);private:BinaryTreeNode<T> *root;};template<class T>void BinaryTree<T>::createTree(const T& info,BinaryTree<T>& left,BinaryTree<T>& right){root=new BinaryTreeNode<T>(info,left.root,right.root);left.root=NULL;right.root=NULL;}template<class T>bool BinaryTree<T>::isEmpty()const{return root?false:true;}template<class T>void BinaryTree<T>::preOrder(BinaryTreeNode<T>* current){if(current != NULL){Visit(current->val());preOrder(current->leftChild());preOrder(current->rightChild());}}template<class T>void BinaryTree<T>::inOrder(BinaryTreeNode<T>* current){if(current!=NULL){inOrder(current->leftChild());Visit(current->val());inOrder(current->rightChild());}}template<class T>void BinaryTree<T>::postOrder(BinaryTreeNode<T>* current){if(current!=NULL){postOrder(current->leftChild());postOrder(current->rightChild());Visit(current->val());}}template<class T>void BinaryTree<T>::preOrderWithoutRec(BinaryTreeNode<T>* current){BinaryTreeNode<T>* pointer = current;stack<BinaryTreeNode<T>*> astack;while(pointer || !astack.empty()){while(pointer){astack.push(pointer);Visit(pointer->val());pointer = pointer->leftChild();}pointer = astack.top();astack.pop();pointer=pointer->rightChild();}}template<class T>void BinaryTree<T>::inOrderWithoutRec(BinaryTreeNode<T>* current){BinaryTreeNode<T>* pointer = current;stack<BinaryTreeNode<T>*> astack;while(pointer || !astack.empty()){while(pointer){astack.push(pointer);pointer = pointer->leftChild();}pointer = astack.top();astack.pop();Visit(pointer->val());pointer=pointer->rightChild();}}template<class T>void BinaryTree<T>::postOrderWithoutRec(BinaryTreeNode<T>* current){StackElem<T> element;using std::stack;stack<StackElem<T>> astack;BinaryTreeNode<T>* pointer;if(current == NULL)return;pointer = current;while(pointer || !astack.empty()){while(pointer){element.pointer=pointer;element.tag=Left;astack.push(element);pointer=pointer->leftChild();}element=astack.top();astack.pop();pointer=element.pointer;if(element.tag==Left){element.tag=Right;astack.push(element);pointer=pointer->rightChild();}else{Visit(pointer->val());pointer=NULL;}}}template<class T>BinaryTreeNode<T>* BinaryTree<T>::parent(BinaryTreeNode<T>* current){if(root==NULL || current==NULL)return NULL;if(current == root)return NULL;using std::stack;stack<BinaryTreeNode<T>*> astack;BinaryTreeNode<T>* pointer = root;while(pointer || !astack.empty()){if(pointer){if(current==pointer->leftChild() || current==pointer->rightChild())return pointer;astack.push(pointer);pointer=pointer->leftChild();}else{pointer = astack.top();astack.pop();pointer=pointer->rightChild();}}}template<class T>BinaryTreeNode<T>* BinaryTree<T>::leftSibling(BinaryTreeNode<T>* current){if(current==NULL)return NULL;BinaryTreeNode<T>* par = this->parent();if(par==NULL || par->leftChild==current)return NULL;return par->leftChild();}template<class T>BinaryTreeNode<T>* BinaryTree<T>::rightSibling(BinaryTreeNode<T>* current){if(current==NULL)return NULL;BinaryTreeNode<T>* par = this->parent();if(par==NULL || par->rightChild==current)return NULL;return par->rightChild();}
Main
#include<iostream>#include<string>#include "BinaryTree.h"using namespace std;int *nextfun(string P){int m = P.length();int *ret = new int[m];ret[0] = 0;for(int i = 1 ; i < m ; i++){int k = ret[i-1];if(P[i] == P[k]){ret[i] = k + 1;}else{while(P[i]!=P[k] && k>0)k = ret[k-1];if(P[i] == P[k])ret[i] = k + 1;elseret[i] = 0;}}return ret;}int KMPStrMatch(string S,string P,int *N){int slen = S.length(),plen = P.length();if(slen < plen)return -1;int i,j=0;for(i = 0 ; i < slen ; i++){while(P[j] != S[i] && j > 0)j = N[j-1];if(P[j] == S[i])j++;cout<<"i="<<i<<";"<<"j="<<j<<endl;if(j == plen)return (i-j+1);}return -1;}int main(){/*string S="abaabababba";string P = "abaa";int* a = nextfun(P);for(int i = 0 ; i < 5 ; i++){cout<<a[i]<<" ";};cout<<endl;cout<<KMPStrMatch(S,P,a)<<endl;*/BinaryTree<char> a,b,c,d,e,f,g,h,i,nulltree;d.createTree('D', nulltree, nulltree);g.createTree('G', nulltree, nulltree);h.createTree('H', nulltree, nulltree);i.createTree('I', nulltree, nulltree);f.createTree('F', h, i);e.createTree('E', g, nulltree);b.createTree('B', d, e);c.createTree('C', nulltree, f);a.createTree('A', b, c);cout<<"pre order:"<<endl;a.preOrder(a.Root());cout<<endl<<"in order:"<<endl;a.inOrder(a.Root());cout<<endl<<"post order:"<<endl;a.postOrder(a.Root());cout<<endl;cout<<"preorder traverse without recusive:"<<endl;a.preOrderWithoutRec(a.Root());cout<<endl;cout<<"inorder traverse without recusive:"<<endl;a.inOrderWithoutRec(a.Root());cout<<endl;cout<<"postorder traverse without recusive:"<<endl;a.postOrderWithoutRec(a.Root());cout<<endl;}
0 0
- 二叉树ADT,周游二叉树,递归非递归,求节点的父节点,兄弟节点
- 求二叉树节点最大距离的非递归算法
- 二叉树中插入节点的递归与非递归
- 二叉树非递归求深度和节点个数
- 二叉树(5)----求二叉树节点数,递归与非递归
- 二叉树(7)----求二叉树叶子节点个数,递归和非递归
- Java二叉树的递归,非递归遍历,高度,节点数,叶子节点数
- Java二叉树的递归,非递归遍历,高度,节点数,叶子节点数
- java语言实现的二叉树的各种操作(包括递归与非递归遍历二叉树,求二叉树的高度,节点总数,叶子节点等)
- 非递归实现交换二叉树的左右子节点
- 二叉树的节点个数和深度(非递归)
- 二叉树中叶子节点的个数(非递归)
- 二叉树(13)----求二叉树中任意两个节点之间的距离,递归和非递归
- 求二叉树中节点的最大距离递归解法
- 求二叉树中节点的最大距离(递归)
- 求二叉树中节点的最大距离 | 递归
- 求二叉树的最大叶子节点距离(递归)
- 二叉树之递归求公共父节点
- 博客程序开发历程【4】-[会员系统-找回密码]{附源码}
- 多维数组
- hduoj1090(A+B for Input-Output Practice(II))
- Centos 下JBoss as7 + jdk+mysql+nginx 网站配置
- lua中的西域刀法
- 二叉树ADT,周游二叉树,递归非递归,求节点的父节点,兄弟节点
- hdu 4870 Rating 多校第一场 概率dp
- 指针,数组和函数
- BUPT 2014新生暑假个人排位赛04
- 在WIN7下配置SAMBA服务器
- hduoj1089(A+B for Input-Output Practice (I))
- 输入6个字符串,并对它们按从大到小的顺序排序后输出
- lua 热更新
- Merge k Sorted Lists