二叉树的遍历算法
1.先序遍历
对每一个节点将其看作根节点按照根左右的顺序进行遍历。
示例代码
void _PreOrderTree(Node* root) //先序遍历二叉树
{
if (root != NULL)
{
cout << root->_data << " ";
_PreOrderTree(root->left);
_PreOrderTree(root->right);
}
return;
}
2.中序遍历
对每一个节点将其看作根节点按照左根右的顺序进行便利。
示例代码
void _InOrderTree(Node* root) //中序遍历二叉树
{
if (root != NULL){
_InOrderTree(root->left);
cout <<root->_data<<" ";
_InOrderTree(root->right);
}
return ;
}
3.后序遍历
对每一个节点将其看作根节点按照左右根的顺序进行便利。
示例代码
void _PostOrderTree(Node* root) //后序遍历二叉树
{
if (root != NULL)
{
_PostOrderTree(root->left);
_PostOrderTree(root->right);
cout << root->_data<<" ";
}
return;
}
4.层序便利二叉树
借助队列出进规则,先定义一个空队列,然后根节点进入队列便利队列的第一个成员即根节点,然后将队列第一个元素的左右节点再依次放入队列,然后弹出对头成员再循环进行之前的操作即可实现层序遍历。
示例代码
void level_order(Node* root) //分层遍历二叉树
{
queue<Node*> q;
if (root != NULL)
q.push(root);
while (!q.empty())
{
cout << q.front()->_data << " ";
if (q.front()->left != NULL)
q.push(q.front()->left);
if (q.front()->right != NULL)
q.push(q.front()->right);
q.pop();
}
}
计算二叉树的深度
size_t _Depth(Node* root) //求二叉树的深度
{
size_t LeftDepth = 1;
size_t RightDepth = 1;
if (root != NULL)
{
LeftDepth += _Depth(root->left);
RightDepth = RightDepth + _Depth(root->right);
return(max(LeftDepth, RightDepth));
}
else return 0;
}
计算二叉树的节点数
size_t NodeSize(Node* root) //求节点总数
{
if (root != NULL)
{
size_t count = 1;
count += NodeSize(root->left) + NodeSize(root->right);
return count;
}
return 0;
}
计算二叉树叶子节点数
size_t LeafSize(Node* root) //叶子节点的数目
{
if (root == NULL)
return 0;
else if (NULL==root->left&&NULL==root->right) //仅当当前的节点的左右孩子节点都为空时该节点为根节点
{
return 1;
}
else
{
int count = 0;
count += LeafSize(root->left) + LeafSize(root->right);
return count;
}
}