非递归(二叉树遍历)

1 先序遍历

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        //设置栈和存储结果的vector
        stack<TreeNode*> s;
        vector<int> ans;
        //使用根节点初始化游标节点
        TreeNode* t = root;
        //当游标节点非空或者栈非空时
        while(t || !s.empty()){
            if(t){
                //如果游标节点非空
                ans.push_back(t->val);
                //游标节点入栈
                s.push(t);
                //更新游标节点
                t = t->left;
            }else{
                //使用父节点的右孩子更新游标节点
                t = s.top()->right;
                //栈顶元素出栈
                s.pop();
            }//if
        }//while
        return ans;
    }
};

2 中序遍历

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        //设置栈和存储结果的vector
        stack<TreeNode*> s;
        vector<int> ans;
        //使用根节点初始化游标节点
        TreeNode* t = root;
        //当游标节点非空或者栈非空时
        while(t || !s.empty()){
           //遍历到最左边的叶结点
            while(t){ s.push(t); t = t->left;}
            if(!s.empty()){
                //输出栈顶元素
                ans.push_back(s.top()->val);
                //使用栈顶元素的右指针更新游标指针
                t = s.top()->right;
                //栈顶元素出栈
                s.pop(); 
            }//if
        }//while
        return ans;
    }
};
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        //设置栈和存储结果的vector
        stack<TreeNode*> s;
        vector<int> ans;
        //使用根节点初始化游标节点
        TreeNode* t = root;
        //当游标节点非空或者栈非空时
        while(t || !s.empty()){
           //遍历到最左边的叶结点
            if(t){ 
                s.push(t); 
                t = t->left;
            }else{
                //输出栈顶元素
                ans.push_back(s.top()->val);
                //使用栈顶元素的右指针更新游标指针
                t = s.top()->right;
                //栈顶元素出栈
                s.pop(); 
            }//if
        }//while
        return ans;
    }
};

3 后序遍历

//  严格按照后序遍历的定义
class Solution {
public:
    vector<int> postorderTraversal(TreeNode *root) {
        vector<int> v;
        stack<TreeNode*> s_stack;
        
        TreeNode *node = root;
        TreeNode *lastVisitNode = NULL;
        while (!s_stack.empty() || node != NULL){
            if (node != NULL){
                // keep going the left
                s_stack.push(node);
                node = node->left;
            }
            else{
                TreeNode *n = s_stack.top();
                // left way is finsised, keep going to the right way
                if (n->right != NULL && lastVisitNode != n->right){
                    node = n->right;
                }
                else{
                    // both left and right has been accessed.
                    s_stack.pop();
                    v.push_back(n->val);
                    //更新上次被访问的节点
                    lastVisitNode = n;
                }
            }
        }
        return v;
    }
};
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树非递归遍历一般使用栈来实现。以下是 C 语言实现二叉树非递归遍历的示例代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; // 定义栈结构 struct Stack { struct TreeNode *data[MAX_SIZE]; int top; }; // 初始化栈 void initStack(struct Stack *s) { s->top = -1; } // 判断栈是否为空 int isEmpty(struct Stack *s) { return s->top == -1; } // 判断栈是否已满 int isFull(struct Stack *s) { return s->top == MAX_SIZE - 1; } // 入栈 void push(struct Stack *s, struct TreeNode *node) { if (isFull(s)) { printf("Stack is full.\n"); return; } s->top++; s->data[s->top] = node; } // 出栈 struct TreeNode *pop(struct Stack *s) { if (isEmpty(s)) { printf("Stack is empty.\n"); return NULL; } struct TreeNode *node = s->data[s->top]; s->top--; return node; } // 二叉树非递归前序遍历 void preorderTraversal(struct TreeNode *root) { if (root == NULL) { return; } struct Stack s; initStack(&s); push(&s, root); while (!isEmpty(&s)) { struct TreeNode *node = pop(&s); printf("%d ", node->val); if (node->right != NULL) { push(&s, node->right); } if (node->left != NULL) { push(&s, node->left); } } } // 二叉树非递归中序遍历 void inorderTraversal(struct TreeNode *root) { if (root == NULL) { return; } struct Stack s; initStack(&s); struct TreeNode *node = root; while (node != NULL || !isEmpty(&s)) { while (node != NULL) { push(&s, node); node = node->left; } node = pop(&s); printf("%d ", node->val); node = node->right; } } // 二叉树非递归后序遍历 void postorderTraversal(struct TreeNode *root) { if (root == NULL) { return; } struct Stack s; initStack(&s); struct TreeNode *node = root; struct TreeNode *lastVisit = NULL; while (node != NULL || !isEmpty(&s)) { while (node != NULL) { push(&s, node); node = node->left; } node = s.data[s.top]; if (node->right == NULL || node->right == lastVisit) { printf("%d ", node->val); lastVisit = node; node = NULL; pop(&s); } else { node = node->right; } } } int main() { struct TreeNode *root = (struct TreeNode *) malloc(sizeof(struct TreeNode)); struct TreeNode *left = (struct TreeNode *) malloc(sizeof(struct TreeNode)); struct TreeNode *right = (struct TreeNode *) malloc(sizeof(struct TreeNode)); root->val = 1; root->left = left; root->right = right; left->val = 2; left->left = NULL; left->right = NULL; right->val = 3; right->left = NULL; right->right = NULL; printf("前序遍历结果:"); preorderTraversal(root); printf("\n中序遍历结果:"); inorderTraversal(root); printf("\n后序遍历结果:"); postorderTraversal(root); return 0; } ``` 这里实现了二叉树非递归前序、中序和后序遍历。需要注意的是,后序遍历的实现比较复杂,需要设置一个 lastVisit 指针来记录上一个访问的结点,以保证不重复访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值