1、二叉樹的建立
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct BTNode{
char data;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode;
void createBTree(BTNode *&root)
{
char c;
cin>>c;
fflush(stdin);
if(c=='#')
{
root=NULL;
}
else
{
root=(BTNode *)malloc(sizeof(BTNode));
root->data=c;
cout<<"please print the left child"<<endl;
createBTree(root->lchild);
cout<<"please print the right child"<<endl;
createBTree(root->rchild);
}
}
int main()
{
BTNode *root;
createBTree(root);
}
2、二叉樹的先序中序後序遞歸遍歷
//二叉樹的先序遞歸遍歷
void preorderRaversal(BTNode *root)
{
if(root)
{
cout<<root->data<<" ";
preorderRaversal(root->lchild);
preorderRaversal(root->rchild);
}
}
//二叉樹的中序遞歸遍歷
void inorderRaversal(BTNode *root)
{
if(root)
{
inorderRaversal(root->lchild);
cout<<root->data<<" ";
inorderRaversal(root->rchild);
}
}
//二叉樹的後續遞歸遍歷
void postorderRaversal(BTNode *root)
{
if(root)
{
postorderRaversal(root->lchild);
postorderRaversal(root->rchild);
cout<<root->data<<" ";
}
}
3、二叉樹的遞歸求深
int getDepth(BTNode *root)
{
int LD,RD;
if(!root)
return 0;
else
{
LD=getDepth(root->lchild);
RD=getDepth(root->rchild);
return (LD>RD ? LD:RD)+1;
}
}
4、二叉樹的先序非遞歸遍歷
對任一節點p
1)訪問p節點,並將p節點入棧
2)判斷p節點的左孩子是否爲空,若爲空,則取棧頂節點並進行出棧操作,並將p右孩子置爲當前的節點p,循環至1),若不爲空,則將p的左孩子置爲p
3)直到p爲NULL,並且棧爲空
//二叉樹的先序非遞歸遍歷
void preorderRaversal2(BTNode *root)
{
const stack<BTNode>::size_type stackSize=100; //給定棧的大小
stack<BTNode> BTNodeStack; //定義一個空棧
BTNode *p=root;
while(p||!BTNodeStack.empty())
{
while(p)
{
cout<<p->data<<" ";
BTNodeStack.push(*p);
p=p->lchild;
}
if(!BTNodeStack.empty())
{
p=&BTNodeStack.top();
BTNodeStack.pop();
p=p->rchild;
}
}
}
5、二叉樹的中序非遞歸遍歷
//中序非遞歸遍歷
void inorderRaversal2(BTNode *root)
{
const stack<BTNode>::size_type stackSize=100; //給定棧的大小
stack<BTNode> BTNodeStack; //定義一個空棧
BTNode *p=root;
while(p||!BTNodeStack.empty())
{
while(p)
{
BTNodeStack.push(*p);
p=p->lchild;
}
if(!BTNodeStack.empty())
{
p=&BTNodeStack.top();
BTNodeStack.pop();
cout<<p->data<<" ";
p=p->rchild;
}
}
}
6、二叉樹的後序非遞歸遍歷
typedef enum{L,R} tagtype;
typedef struct
{
BTNode *p;
tagtype tag;
}stacknode;
void postorderRaversal2(BTNode *root)
{
const stack<stacknode>::size_type stackSize=100; //給定棧的大小
stack<stacknode> BTNodeStack; //定義一個空棧
BTNode *p=root;
stacknode x;
do
{
while (p)
{
x.p=p;
x.tag=L;
BTNodeStack.push(x);
p=p->lchild;
}
while(!BTNodeStack.empty()&&BTNodeStack.top().tag==R)
{
x=BTNodeStack.top();
BTNodeStack.pop();
p=x.p;
cout<<p->data<<" ";
}
if(!BTNodeStack.empty())
{
BTNodeStack.top().tag=R;
p=BTNodeStack.top().p->rchild;
}
}while(!BTNodeStack.empty());
}