[传统算法] 二叉树非递归遍历C++实现

参考

先序遍历

法一

void dlr(TreeNode* root) {
	if(!root)  return;
	
    stack stk;  
    stk.push(root);
    
    while(!stk.empty()){
        TreeNode *node = stk.top();
        cout << node->val << ' ';
        stk.pop();
        if(node->right)
            stk.push(node->right);
        if(node->left)
            stk.push(node->left);
    }
}

法二

void dlr(TreeNode* root) {
    stack stk;    
    
    while(root != NULL || !stk.empty()){
        if(root != NULL){
            stk.push(root);
            cout << root->val << ' ';
            root = root->left;
        }else{
            root = stk.top();
            stk.pop();
            root = root->right;
        }
    }
}

中序遍历

void ldr(TreeNode* root) {
    stack stk;
    
    while(root != NULL || !stk.empty()){
        if(root != NULL){
            stk.push(root);
            root = root->left;
        }else{
            root = stk.top();
            cout << root->val << ' ';
            stk.pop();
            root = root->right;
        }
    }
}

后序遍历

void lrd(TreeNode* root) {
	if(!root)  return;
    
    stack stk, output;
    stk.push(root);
    
    while(!stk.empty()){
        TreeNode *node = stk.top();
        output.push(node);
        stk.pop();
        if(node->left)
            stk.push(node->left);
        if(node->right)
            stk.push(node->right);
    }
    
    while(!output.empty()){
        cout << output.top()->val << ' ';
        output.pop();
    }
}

层序遍历

void level(TreeNode* root) {
	if(!root)  return;
   
    queue q;
    q.push(root);
    
    while(!q.empty()){
        for(int i = 0, n = q.size(); i < n; i++){
            TreeNode *node = q.front();
            if(node->left)
                q.push(node->left);
            if(node->right)
                q.push(node->right);
            cout << node->val << ' ';
            q.pop();
        }
    }
}

你可能感兴趣的:(传统算法)