您的位置:首页 > 其它

二叉树的三种遍历

2016-09-08 11:26 113 查看
二叉树的三种遍历:前序、中序、后序。包括递归和非递归的

前序遍历:root节点在最前。root节点、左子节点,右子节点

递归:

//前序递归
void preOrder1(TreeNode* root)
{
if (root == NULL) return;
cout << root->val << " ";   //root的输出在最前面
preOrder1(root->left);
preOrder1(root->right);
}


非递归:

//前序非递归
void preOrder2(TreeNode* root)
{
if (root == NULL) return;
stack<TreeNode*> stk;
while (root != NULL || !stk.empty())
{
while (root != NULL)
{
stk.push(root);
cout << root->val << " ";   // root的输出在前面
root = root->left;
}
if (!stk.empty())
{
root = stk.top();
stk.pop();
root = root->right;
}
}
}


中序遍历:root在中间。左子节点、root节点、右子节点

递归:

//中序递归
void midOrder1(TreeNode* root)
{
if (root == NULL) return;
midOrder1(root->left);
cout << root->val << " ";  //root的输出在中间
midOrder1(root->right);
}


非递归:

//中序非递归
void midOrder2(TreeNode* root)
{
if (root == NULL) return;
stack<TreeNode*> stk;
while (root != NULL || !stk.empty())
{
while (root != NULL)
{
stk.push(root);
root = root->left;
}
if (!stk.empty())
{
root = stk.top();
cout << root->val << " ";  //root输出在中间,无左子节点后
stk.pop();
root = root->right;
}
}
}


后序遍历:root在最后。左子节点、右子节点、root节点。

递归:

//后序递归
void postOrder1(TreeNode* root)
{
if (root == NULL) return;
postOrder1(root->left);
postOrder1(root->right);
cout << root->val << " ";  //root的输出在最后
}


非递归:

//后序非递归
void postOrder2(TreeNode* root)
{
if (root == NULL) return;
stack<TreeNode*> stk;
stk.push(root);
TreeNode* pre = NULL;
TreeNode* cur = NULL;
while (!stk.empty())   //root!=NULL??最后一步时,root!=NULL但是程序已结束,变的的cur 不是root
{
cur = stk.top();
if ((cur->left == NULL && cur->right == NULL) || (pre != NULL && (pre == cur->left || pre == cur->right)))  ////如果当前结点没有孩子结点或者孩子节点都已被访问过
{
cout << cur->val << " ";
pre = cur;
stk.pop();
}
else
{
if (cur->right)
stk.push(cur->right);
if (cur->left)
stk.push(cur->left);
}
}
}


  观察可以发现,对于递归的解法,三种遍历很相似,唯一的不同点就是,输出节点的位置。

    前序遍历:输出节点在最前面。中序遍历:输出节点在中间。后序遍历:输出节点在最后。

  对于非递归则是用栈来实现。首先判断节点是否为空。最终要的是判断循环条件。如果条件不正确,事倍功半
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: