#include<iostream>
#include<queue>
#include<stack>
using namespace std;
enum Tags {Left,Right};
template<class T>
class StackElement;
template<class T>
class BinaryTreeNode
{
public:
T info;
BinaryTreeNode<T> * left;
BinaryTreeNode<T> * right;
BinaryTreeNode() {}
BinaryTreeNode(const T& ele)
{
info = ele;
left = NULL;
right = NULL;
}
BinaryTreeNode(const T& ele,BinaryTreeNode<T> *l, BinaryTreeNode<T> *r)
{
info = ele;
left = l;
right = r;
}
};
template <class T>
class BinaryTree
{
public:
BinaryTreeNode<T> * root;
BinaryTree()
{
root = NULL;
}
~BinaryTree()
{
deleteBinaryTree(root);
}
void create(BinaryTreeNode<T>* &temp)
{
T data;
int flag1,flag2;
cout<<"请按格式输入:数据,是否有左节点(1/0),是否有右节点(1/0)"<<endl;
cin>>data>>flag1>>flag2;
temp = new BinaryTreeNode<T>(data);
if(flag1 && flag2)
{
create(temp->left);
create(temp->right);
}
else if(flag1)
{
create(temp->left);
}
else if(flag2)
{
create(temp->right);
}
else
{
}
}
void levelOrderPrint(BinaryTreeNode<T> *root)
{
queue<BinaryTreeNode<T>*> aQueue;
BinaryTreeNode<T> *pointer = root;
if (pointer)
{
aQueue.push(pointer);
}
while (!aQueue.empty())
{
pointer = aQueue.front();
cout<<pointer->info<<' ';
aQueue.pop();
if (pointer->left != NULL)
aQueue.push(pointer->left);
if (pointer->right != NULL)
aQueue.push(pointer->right);
}
}
void levelOrderCounter(BinaryTreeNode<T> *root)
{
int counter0 = 0,counter1 = 0,counter2 = 0;
char Max = root->info;
queue<BinaryTreeNode<T>*> aQueue;
BinaryTreeNode<T> *pointer = root;
if (pointer)
{
aQueue.push(pointer);
}
while (!aQueue.empty())
{
pointer = aQueue.front();
if(pointer->info > Max)
Max = pointer->info;
if(pointer->left && pointer->right)
counter0++;
else if(pointer->left || pointer->right)
counter1++;
else
counter2++;
aQueue.pop();
if (pointer->left != NULL)
aQueue.push(pointer->left);
if (pointer->right != NULL)
aQueue.push(pointer->right);
}
cout<<"度为2的节点:"<<counter0<<" 度为1的节点:"<<counter1<<" 度为0的节点:"<<counter2<<endl;
cout<<"最大值为:"<<Max<<endl;
}
void deleteBinaryTree(BinaryTreeNode<T> *temp)
{
if(temp->left)
deleteBinaryTree(temp->left);
if(temp->right)
deleteBinaryTree(temp->right);
delete(temp);
}
BinaryTreeNode<T>* Root()
{
return root;
}
void BiTreeDepth(BinaryTreeNode<T> * p, int level, int &depth)
{
if (p)
{
if (level>depth) depth = level;
BiTreeDepth(p->left, level+1, depth);
BiTreeDepth(p->right, level+1, depth);
}
}
void ChangePos(BinaryTreeNode<T> * root)
{
BinaryTreeNode<T> * temp;
if (root != NULL)
{
temp = root->left;
root->left = root->right;
root->right = temp;
ChangePos(root->left);
ChangePos(root->right);
}
}
void BiTreeLevelCounter(BinaryTreeNode<T> * p, int level, int arr[], int n)
{
if (p)
{
arr[level-1]++;
BiTreeLevelCounter(p->left, level+1, arr, n);
BiTreeLevelCounter(p->right, level+1, arr, n);
}
}
bool levelOrderComplete(BinaryTreeNode<T> *root)
{
queue<BinaryTreeNode<T>*> aQueue;
BinaryTreeNode<T> *pointer = root;
int flag = 0;
if (pointer)
{
aQueue.push(pointer);
}
while (!aQueue.empty())
{
pointer = aQueue.front();
if(pointer->left != NULL && flag)
return false;
if(pointer->left == NULL){
flag = 1;
}
if(pointer->right != NULL && flag)
return false;
if(pointer->right == NULL)
flag = 1;
*/
aQueue.pop();
if (pointer->left != NULL)
{
if(flag)
return false;
else
aQueue.push(pointer->left);
}
else
flag = 1;
if (pointer->right != NULL)
{
if(flag)
return false;
else
aQueue.push(pointer->right);
}
else
flag = 1;
}
return true;
}
void PreOrder (BinaryTreeNode<T> *root)
{
if (root != NULL)
{
cout<<root->info<<' ';
PreOrder(root->left);
PreOrder(root->right);
}
}
void PreOrderWithoutRecursion(BinaryTreeNode<T> *root)
{
stack<BinaryTreeNode<T>*> aStack;
BinaryTreeNode<T> *pointer = root;
while (!aStack.empty() || pointer)
{
if(pointer)
{
cout<<pointer->info<<' ';
if (pointer->right != NULL)
aStack.push(pointer->right);
pointer = pointer->left;
}
else
{
pointer = aStack.top();
aStack.pop();
}
}
}
void InOrder (BinaryTreeNode<T> *root)
{
if (root != NULL)
{
InOrder (root->left);
cout<<root->info<<' ';
InOrder(root->right);
}
}
void InOrderWithoutRecursion(BinaryTreeNode<T> *root)
{
stack<BinaryTreeNode<T>* > aStack;
BinaryTreeNode<T> *pointer = root;
while (!aStack.empty() || pointer)
{
if (pointer)
{
aStack.push(pointer);
pointer = pointer->left;
}
else
{
pointer = aStack.top();
aStack.pop();
cout<<pointer->info<<' ';
pointer = pointer->right;
}
}
}
void PostOrder(BinaryTreeNode<T> *root)
{
if (root != NULL)
{
PostOrder(root->left);
PostOrder (root->right);
cout<<root->info<<' ';
}
}
void PostOrderWithoutRecursion(BinaryTreeNode<T>* root)
{
StackElement<T> element;
stack<StackElement<T > > aStack;
BinaryTreeNode<T>* pointer;
if (root == NULL)
return;
else pointer = root;
while (!aStack.empty() || pointer)
{
while (pointer != NULL)
{
element.pointer = pointer;
element.tag = Left;
aStack.push(element);
pointer = pointer->left;
}
element = aStack.top();
aStack.pop();
pointer = element.pointer;
if (element.tag == Left)
{
element.tag = Right;
aStack.push(element);
pointer = pointer->right;
}
else
{
cout<<pointer->info<<' ';
pointer = NULL;
}
}
}
void deleteLeave(BinaryTreeNode<T>* temp)
{
if(temp == NULL)
return ;
if(temp->left == NULL && temp->right == NULL)
{
cout<<temp->info<<' ';
delete temp;
temp = NULL;
return ;
}
if(temp->left)
if(temp->left->left == NULL && temp->left->right == NULL){
cout<<temp->left->info<<' ';
delete temp->left;
temp->left = NULL;
}
if(temp->right)
if(temp->right->left == NULL && temp->right->right == NULL){
cout<<temp->right->info<<' ';
delete temp->right;
temp->right = NULL;
}
deleteLeave(temp->left);
deleteLeave(temp->right);
}
};
template <class T>
class StackElement
{
public:
BinaryTreeNode<T>* pointer;
Tags tag;
};
int main()
{
BinaryTree<char> b1;
b1.create(b1.root);
cout<<"广度优先遍历:";
b1.levelOrderPrint(b1.root);
cout<<endl;
cout<<"前序遍历:";
b1.PreOrder(b1.root);
cout<<endl;
cout<<"非递归前序遍历:";
b1.PreOrderWithoutRecursion(b1.root);
cout<<endl;
cout<<"中序遍历:";
b1.InOrder(b1.root);
cout<<endl;
cout<<"非递归前序遍历:";
b1.InOrderWithoutRecursion(b1.root);
cout<<endl;
cout<<"后序遍历:";
b1.PostOrder(b1.root);
cout<<endl;
cout<<"非递归后序遍历:";
b1.PostOrderWithoutRecursion(b1.root);
cout<<endl;
b1.levelOrderCounter(b1.root);
cout<<"是否是完全二叉树?"<<b1.levelOrderComplete(b1.root)<<endl;
int Max = 0;
int arr[10] = {0};
b1.BiTreeLevelCounter(b1.root, 1, arr, 10);
for(int i = 0; i < 10; i++)
{
if(arr[i]>Max)
Max = arr[i];
}
cout<<"结点数最多一层的结点个数:"<<Max<<endl;
int depth = 1;
b1.BiTreeDepth(b1.root, 1, depth);
cout<<"深度:"<<depth<<endl;
b1.ChangePos(b1.root);
b1.levelOrderPrint(b1.root);
cout<<"删除所有叶子节点:";
b1.deleteLeave(b1.root);
cout<<endl;
b1.PreOrder(b1.root);
return 0;
}