#ifndef BINTREE_H
#define BINTREE_H
#include<iostream>
#include<stack>
#include<math.h>
using namespace std;
template<class Type>
class BinTree;
template<class Type>
class BinTreeNode
{
public:
friend class BinTree<Type>;
BinTreeNode():m_value(Type()),LeftChild(NULL),RightChild(NULL)
{}
BinTreeNode(Type value):m_value(value),LeftChild(NULL),RightChild(NULL)
{}
~BinTreeNode()
{}
private:
Type m_value;
BinTreeNode *LeftChild;
BinTreeNode *RightChild;
};
template<class Type>
class BinTree
{
public:
BinTree():root(NULL)
{}
BinTree(Type value):root(NULL),refavl(value)
{}
public:
void CreateBinTree(char *&str)
{CreateBinTree(root,str);}
public:
void PreOrder()
{ PreOrder(root);}
void IsBalanced()
{
if(IsBalanced(root))
{
cout << "平衡"<<endl;
}
else
cout <<"不平衡"<<endl;
}
void TreeDepth()
{
int length =TreeDepth(root);
cout << length<<endl;
}
protected:
void CreateBinTree(BinTreeNode<Type>*&t,char *&str);
void PreOrder(BinTreeNode<Type> *&t);
int TreeDepth(BinTreeNode<Type> *&pRoot);
bool IsBalanced(BinTreeNode<Type>*&pRoot);
bool IsBalanced(BinTreeNode<Type>*&pRoot,int *depth);
private:
BinTreeNode<Type> *root;
Type refavl;
};
template<class Type>
void BinTree<Type>::CreateBinTree(BinTreeNode<Type>*&t,char *&str)
{
if(*str == refavl)
{t = NULL;}
else
{
t = new BinTreeNode<Type>(*str);
CreateBinTree(t->LeftChild,++str);
CreateBinTree(t->RightChild,++str);
}
}
template<class Type>
void BinTree<Type>::PreOrder(BinTreeNode<Type>*&t)
{
if(t == NULL)
return ;
stack<BinTreeNode<Type>*> st;
st.push(t);
while(!st.empty())
{
BinTreeNode<Type>*p = st.top();
st.pop();
cout << p->m_value<<" ";
if(p->RightChild != NULL)
st.push(p->RightChild);
if(p->LeftChild != NULL)
st.push(p->LeftChild);
}
cout << endl;
}
template<class Type>//树的深度计算:利用递归从叶子结点开始一次计算深度;
int BinTree<Type>::TreeDepth(BinTreeNode<Type> *&pRoot)
{
if(pRoot == NULL)
return 0;
int nLeft = TreeDepth(pRoot->LeftChild);
int nRight = TreeDepth(pRoot->RightChild);
return nLeft>nRight?nLeft+1:nRight+1;
}
template<class Type>//判断是否是平衡二叉树
bool BinTree<Type>::IsBalanced(BinTreeNode<Type> *&pRoot)
{
int depth = 0;
return (IsBalanced(pRoot,&depth));
}
template<class Type>//从叶子节点开始每个结点只需遍历一次。
bool BinTree<Type>::IsBalanced(BinTreeNode<Type> *&pRoot,int *depth)
{
if(pRoot == NULL)
{
*depth = 0;
return true;
}
int left,right;
if(IsBalanced(pRoot->LeftChild,&left)&&IsBalanced(pRoot->RightChild,&right))
{
int sub = left - right;//高度只差是否小于1;
if(abs(sub) <= 1)
{
*depth = left >right?left+1:right+1;
return true;
}
}
return false;
}
#endif
//测试代码
#include"BinTree.h"
void main()
{
char *str="124##57###3##";
BinTree<char>bt('#');
bt.CreateBinTree(str);
bt.PreOrder();
bt.TreeDepth();//二叉树的深度求解;
bt.IsBalanced();//是否是平衡二叉树;
}
#define BINTREE_H
#include<iostream>
#include<stack>
#include<math.h>
using namespace std;
template<class Type>
class BinTree;
template<class Type>
class BinTreeNode
{
public:
friend class BinTree<Type>;
BinTreeNode():m_value(Type()),LeftChild(NULL),RightChild(NULL)
{}
BinTreeNode(Type value):m_value(value),LeftChild(NULL),RightChild(NULL)
{}
~BinTreeNode()
{}
private:
Type m_value;
BinTreeNode *LeftChild;
BinTreeNode *RightChild;
};
template<class Type>
class BinTree
{
public:
BinTree():root(NULL)
{}
BinTree(Type value):root(NULL),refavl(value)
{}
public:
void CreateBinTree(char *&str)
{CreateBinTree(root,str);}
public:
void PreOrder()
{ PreOrder(root);}
void IsBalanced()
{
if(IsBalanced(root))
{
cout << "平衡"<<endl;
}
else
cout <<"不平衡"<<endl;
}
void TreeDepth()
{
int length =TreeDepth(root);
cout << length<<endl;
}
protected:
void CreateBinTree(BinTreeNode<Type>*&t,char *&str);
void PreOrder(BinTreeNode<Type> *&t);
int TreeDepth(BinTreeNode<Type> *&pRoot);
bool IsBalanced(BinTreeNode<Type>*&pRoot);
bool IsBalanced(BinTreeNode<Type>*&pRoot,int *depth);
private:
BinTreeNode<Type> *root;
Type refavl;
};
template<class Type>
void BinTree<Type>::CreateBinTree(BinTreeNode<Type>*&t,char *&str)
{
if(*str == refavl)
{t = NULL;}
else
{
t = new BinTreeNode<Type>(*str);
CreateBinTree(t->LeftChild,++str);
CreateBinTree(t->RightChild,++str);
}
}
template<class Type>
void BinTree<Type>::PreOrder(BinTreeNode<Type>*&t)
{
if(t == NULL)
return ;
stack<BinTreeNode<Type>*> st;
st.push(t);
while(!st.empty())
{
BinTreeNode<Type>*p = st.top();
st.pop();
cout << p->m_value<<" ";
if(p->RightChild != NULL)
st.push(p->RightChild);
if(p->LeftChild != NULL)
st.push(p->LeftChild);
}
cout << endl;
}
template<class Type>//树的深度计算:利用递归从叶子结点开始一次计算深度;
int BinTree<Type>::TreeDepth(BinTreeNode<Type> *&pRoot)
{
if(pRoot == NULL)
return 0;
int nLeft = TreeDepth(pRoot->LeftChild);
int nRight = TreeDepth(pRoot->RightChild);
return nLeft>nRight?nLeft+1:nRight+1;
}
template<class Type>//判断是否是平衡二叉树
bool BinTree<Type>::IsBalanced(BinTreeNode<Type> *&pRoot)
{
int depth = 0;
return (IsBalanced(pRoot,&depth));
}
template<class Type>//从叶子节点开始每个结点只需遍历一次。
bool BinTree<Type>::IsBalanced(BinTreeNode<Type> *&pRoot,int *depth)
{
if(pRoot == NULL)
{
*depth = 0;
return true;
}
int left,right;
if(IsBalanced(pRoot->LeftChild,&left)&&IsBalanced(pRoot->RightChild,&right))
{
int sub = left - right;//高度只差是否小于1;
if(abs(sub) <= 1)
{
*depth = left >right?left+1:right+1;
return true;
}
}
return false;
}
#endif
//测试代码
#include"BinTree.h"
void main()
{
char *str="124##57###3##";
BinTree<char>bt('#');
bt.CreateBinTree(str);
bt.PreOrder();
bt.TreeDepth();//二叉树的深度求解;
bt.IsBalanced();//是否是平衡二叉树;
}