二叉树的深度求值和判断是否是平衡

#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();//是否是平衡二叉树;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值