數據結構--樹(建立、遍歷)


目前正准備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<<"\nRecursive results:"<<endl;
    inorder(root);
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM