typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild; //左右孩子
}BiTNode,*BiTree;
//先序遍歷(根左右)(遞歸)
void LastOrder(BiTNode *root)
{
if(root != NULL)
{
cout << root->data<<endl;
LastOrder(root->lchild);
LastOrder(root->rchild);
}
}
void PreOrder(BiTNode *root){ if(root != NULL) { cout << root->data<<endl; PreOrder(root->lchild); PreOrder(root->rchild); } } //中序遍歷(左根右)(遞歸)
void MidOrder(BiTNode *root)
{
if(root != NULL)
{
MidOrder(root->lchild);
cout << root->data<<endl;
MidOrder(root->rchild);
}
}
//後續遍歷(左右根)(遞歸)
void LastOrder(BiTNode *root)
{
if(root != NULL)
{
cout << root->data<<endl;
LastOrder(root->lchild);
LastOrder(root->rchild);
}
}
//先序的非遞歸 需要用到棧
void PreOrder(BiTNode *root)
{
if(root == NULL)
return NULL;
stack<BiTNode> st;
st.push(root);
BiTNode *temp;
while(!st.empty())
{
temp = st.top(); //返回棧頂元素
cout<<temp->data<<" ";
st.pop();
if(temp->rchild!=NULL) //這裏先遍歷右節點,因爲棧是後進先出,因爲要先出左節點,所以要先進右節點
st.push(temp->rchild);
if(temp->lchild!=NULL)
st.push(temp->lchild);
}
}
//中序的非遞歸
void MidOrder(BiTNode *root)
{
if (root == NULL)
return NULL;
stack<BiTNode*> st;
BiTNode cur = root->lchild; //create one pointer point to root's left node
st.push(root); //root into stack
while(cur != NULL && !(st.empty()))
{
while(cur !=NULL )
{
st.push(cur);
cur = cur->lchild; //一直向左遍歷,然後進棧
}
cur = st.top(); //cur = stack.top 就是最左的那個位置
st.pop(); //最左出棧
cout<<cur->data<<" "; //輸出最左
cur = cur->rchild;
}
}
//後序非遞歸(待補充)
//樹的深度
int depth(BiTNode *root)
{
if(root==NULL)//如果rootoot爲NULL,則深度爲0,這也是遞歸的返回條件
return 0;
//如果pRoot不爲NULL,那麼深度至少爲1,所以left和right=1
int left=1;
int right=1;
left+=depth(root->lchild);//求出左子樹的深度
right+=depth(root->rchild);//求出右子樹深度
return (left>right?left:right)+1;//返回深度較大的那一個,+1是因爲沒算根節點那一層
}