zoukankan      html  css  js  c++  java
  • 数据结构--树(建立、遍历)

    目前正准备2020届秋招 算法工程师,复习数据结构!

    发现树遍历可以达到O(n)时间复杂度,O(1)空间复杂度(Morris遍历),赶紧学习了一波。并复习了建立树、遍历树的一些基本操作。

    #include<iostream>
    #include<queue>
    #include<cstring>
    using namespace std;
    struct TreeNode{
        int val;
        TreeNode *left, *right;
        TreeNode(int x): val(x), left(NULL), right(NULL){}
    }; 
    
    //初始化树 
    TreeNode* init_tree1(TreeNode *root, int val){
        if(root==NULL){
            root = new TreeNode(val);
            return root;
        }
        if(val<root->val){
            root->left = create_tree(root->left, val); 
        }else{
            root->right = create_tree(root->right, val); 
        }
        
        return root;
    }
    
    //初始化树 
    void init_tree2(TreeNode *&root){
        string data;
        cin>>data;
        if(data=="#"){
            root=NULL;
        }else{
            root = new TreeNode(stoi(data));
            init_tree(root->left);
            init_tree(root->right);
        }
    }
    //中序遍历,时间复杂度O(n),空间复杂度O(1) 
    void MorrisTraversal(TreeNode *root){
        TreeNode *cur = root, *prev = NULL;
        while(cur!=NULL){
            //1. 如果该节点左子树为空,则输出
            if(cur->left==NULL){
                cout<<cur->val<<" ";
                cur = cur->right;   //指向父亲节点 
            }else{
                prev = cur->left;
                while(prev->right!=NULL && prev->right!=cur){
                    prev = prev->right;              //找当前节点左子树最右的节点 
                }
                if(prev->right==NULL){
                    prev->right = cur;
                    cur = cur->left;
                
                }else if(prev->right==cur){
                    //说明该节点直接前驱已访问,则访问该节点 
                    cout<<cur->val<<" ";
                    //下一步指向该节点右子树,继续进行
                    cur = cur->right; 
                    prev->right = NULL; //恢复为原来节点结构 
                }
            } 
            
        }
        cout<<endl;
    }
    
    //中序遍历,时间复杂度O(n),空间复杂度O(n) 
    void inorder(TreeNode *root){
        if(root){
            inorder(root->left);
            cout<<root->val<<" "; 
            inorder(root->right);     
        }
    }
    
    //层次遍历 
    void levelOrder(TreeNode* root){
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty()){
            int size = q.size();
            for(int i=0;i<size;i++){
                TreeNode *temp = q.front();
                q.pop();
                cout<<temp->val<<" ";
                if(temp->left) q.push(temp->left);
                if(temp->right) q.push(temp->right);
            }
            cout<<endl;
        }
    }
    int main(){
        TreeNode *root=NULL;
        int s[] = {4,2,6,1,3,5};
        for(int i=0;i<6;i++)
            root = init_tree1(root, s[i]);
        //init_tree2(root);
        levelOrder(root);
        
        cout<<"Morris results: "<<endl;
        MorrisTraversal(root);
        
        cout<<"
    Recursive results:"<<endl;
        inorder(root);
        return 0;
    }
  • 相关阅读:
    linux常用命令的英文单词缩写
    Linux常用指令总结
    java exception "file not found or file not exist"
    Linux清空屏幕和清空当前输入的快捷键
    巨蟒python全栈开发-第10天 函数进阶
    为什么不能在函数中给全局变量赋值?
    巨蟒python全栈开发-第9天 初识函数
    巨蟒python全栈开发-第8天 文件操作
    windows10怎样关闭,开机启动项中不需要的应用?
    巨蟒python全栈开发-第7天 基本数据类型补充&深浅拷贝
  • 原文地址:https://www.cnblogs.com/logo-88/p/11273222.html
Copyright © 2011-2022 走看看