一、二叉树遍历
1、前序遍历(根左右----DLR)
void PreOrder(BiTNode *root)
{
if(root == nullptr)
return;
cout<<root->data<<" ";
PreOrder(root->lchild);
PreOrder(root->rchild);
}
void PreOrder(BiTNode *root)
{
if(root == nullptr)
return;
stack<BiTNode*> st;
cout<<root->data<<" "<<endl;
st.push(root);
root = root->lchild;
while(!st.empty() || root)
{
while(root)
{
cout<<root->data<<" ";
st.push(root);
root = root->lchild;
}
root = st.top()->rchild;
st.pop();
}
}
2、中序遍历(左根右----LDR)
void InOrder(BiTNode *root)
{
if(root == nullptr)
return;
InOrder(root->lchild);
cout<<root->data<<" ";
InOrder(root->rchild);
}
void InOrder(BiTNode *root)
{
if(root == nullptr)
return;
stack<BiTNode*> st;
st.push(root);
root = root->lchild;
while(!st.empty() || root)
{
while(root)
{
st.push(root);
root = root->lchild;
}
cout<<st.top()->data<<" ";
root = st.top()->rchild;
st.pop();
}
}
3、后序遍历(左右根----LRD)
void PostOrder(BiTNode *root)
{
if(root == nullptr)
return;
PostOrder(root->lchild);
PostOrder(root->rchild);
cout<<root->data<<" ";
}
void PostOrder(BiTNode *root)
{
if(root == nullptr)
return;
stack<BiTNode*> st;
BiTNode *pre = nullptr;
st.push(root);
while(!st.empty() || root)
{
root = st.top();
if((root->lchild==nullptr && root->rchild==nullptr)||
(pre && (pre == root->lchild || pre == root->rchild)))
{
cout<<root->data<<" ";
pre = root;
st.pop();
}
else
{
if(root->rchild)
st.push(root->rchild);
if(root->lchild)
st.push(root->lchild);
}
}
}
4、层次遍历
基于广度优先搜搜思想的二叉树遍历算法,依次对于每一层进行遍历,直到遍历到二叉树最下面一层的结点为止,需要用一个队列结构辅助实现(先进先出)。
void LayerOrder(BiTNode *root)
{
queue<BitNode*> Q;
BiTNode *p = root;
if(p == nullptr)
return;
Q.push(p);
while(!Q.empty())
{
p = Q.front();
cout<<p->data<<" ";
Q.pop();
if(p->lchild)
Q.push(p->lchild);
if(p->rchild)
Q.push(p->rchild);
}
}
二、二叉树的深度和叶子结点个数
1、二叉树深度
深度优先遍历,比较左右深度
int maxDepth(BiTNode* root)
{
if(root == nullptr)
return 0;
int left_len = maxDepth(root->left) + 1;
int right_len = maxDepth(root->right) + 1;
return left_len>right_len?left_len:right_len;
}
2、二叉树叶子节点数
所谓叶子结点就是其左孩子和右孩子均为NULL的结点。遍历整棵二叉树,统计叶子结点个数。
int getLeavesCount(BiTNode *root)
{
if(root == nullptr)
return 0;
if(root->left==nullptr && root->right==nullptr)
return 1;
return getLeavesCount(root->left) + getLeavesCount(root->left);
}
int getCount(BiTNode *root)
{
if(root == nullptr)
return 0;
return getCount(root->left) + getCount(root->left) + 1;
}
|