二叉树基础算法总结

记录一些二叉树的基础算法

二叉树节点结构:

typedef struct TreeNode{
    int val;
    struct TreeNode *left;
    struct TreeNode *right;           
}TreeNode,*Node;

1.遍历

前、中、后序递归遍历:

void pre_order_traversal(TreeNode *root){
    if(root! = NULL){
        visit(root);
        pre_order_traversal(root->left);
        pre_order_traversal(root->right);
    }
}
void in_order_traversal(TreeNode *root){
    if(root! = NULL){
        pre_order_traversal(root->left);
        visit(root);
        pre_order_traversal(root->right);
    }
}
void post_order_traversal(TreeNode *root){
    if(root! = NULL){
        pre_order_traversal(root->left);
        pre_order_traversal(root->right);
        visit(root);
    }
}

前、中、后序非递归遍历:

void pre_order_traversal(TreeNode *root){
    if(root==NULL)return;
    stack<TreeNode> stack;
    while(root!=NULL || !stack.empty()){
        if(root){
            visit(root);
            stack.push(root);
            root=root->left;
        }else{
            root=stack.pop();
            root=root->right;
        }
    }
}
void in_order_traversal(TreeNode *root){
    if(root==NULL)return;
    stack<TreeNode> stack;
    while(root!=NULL || !stack.empty()){
        if(root){
            stack.push(root);
            root=root->left;
        }else{
            root=stack.pop();
            visit(root);
            root=root->right;
        }
    }
}
void post_order_traversal(TreeNode *root){
    if(root==NULL)return;
    stack<TreeNode> stack;
    TreeNode *flag = NULL;
    while(root!=NULL || !stack.empty()){
        if(root){
            stack.push(root);
            root=root->left;
        }else{
            root=stack.top();
            if(root->right && root->right != flag){
                root=root->right;
            }else{
                root=stack.pop();
                visit(root);
                flag=root;
                root=NULL;
            }
        }
    }
}

层次遍历:

void level_order_traversal(TreeNode *root){
    if(root == NULL)return;
    queue<TreeNode> queue;
    queue.push(root);
    while(!queue.empty()){
        root = queue.pop();
        visit(root);
        if(root->left){
            queue.push(root->left);
        }
        if(root->right){
            queue.push(root->right);
        }
    }
}

 

posted on 2014-09-09 18:56  高山漏水  阅读(219)  评论(0编辑  收藏  举报