二叉树前中后、层次遍历

 

#include<iostream>
#include<stack>
#include<queue>
using namespace std;

/*
二叉树遍历算法递归+非递归:
前序遍历:根->左->右
中序遍历:左->根->右
后序遍历:左->右->根
层次遍历
*/
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x): val(x),left(NULL),right(NULL) {}
};

/*递归版本*/
void prerecusive(TreeNode *root)
{
    if (!root) return;
    cout << root->val << " ";
    prerecusive(root->left);
    prerecusive(root->right);
}
void inrecusive(TreeNode *root)
{
    if (!root) return;
    inrecusive(root->left);
    cout << root->val << " ";
    inrecusive(root->right);
}
void postrecusive(TreeNode *root)
{
    if (!root) return;
    postrecusive(root->left);
    postrecusive(root->right);
    cout << root->val << " ";
}

/*循环版本。栈做辅助*/
void preiteration(TreeNode *root)
{
    if (!root) return;
    stack<TreeNode *> s;
    s.push(root);
    while (!s.empty())
    {
     TreeNode *curr=s.top(); cout
<< curr->val << " "; s.pop(); if (curr->right) s.push(curr->right); if (curr->left) s.push(curr->left); } } void initeration(TreeNode *root) { if (!root) return; stack<TreeNode *> s; TreeNode *curr = root; while (curr || !s.empty())//s没有值,第一个判断条件是curr不是空 { if (curr) { s.push(curr); curr = curr->left; } else { cout << s.top()->val << " "; curr = s.top()->right; s.pop(); } } } void postiteration(TreeNode *root) { if (!root) return; stack<TreeNode *> s; s.push(root); TreeNode *curr; TreeNode *visited;//记录子节点已经访问过 while (!s.empty()) { curr = s.top(); /* * 出栈条件: * 对于叶子节点:直接弹出 * 对于非叶子节点:如果已经遍历过其左子节点或右子节点,则弹出 */ if ((!curr->left && !curr->right) || (visited && (curr->left==visited || curr->right == visited))) { cout << curr->val << " "; visited = curr; s.pop(); } else { if (curr->right) s.push(curr->right); if (curr->left) s.push(curr->left); } } } void leveltraverse(TreeNode *root) { if (!root) return; queue<TreeNode *> q; TreeNode *curr; q.push(root); while (!q.empty()) { curr = q.front(); cout << curr->val << " "; q.pop(); if (curr->left) q.push(curr->left); if (curr->right) q.push(curr->right); } }

 

posted @ 2019-05-23 20:17  前进的code  阅读(291)  评论(0编辑  收藏  举报