589. N 叉树的前序遍历 栈模拟前序遍历树

589. N 叉树的前序遍历

思路

栈的模拟,在下面的代码中写出了详细的注释。

代码

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/
// 树的前序遍历,非递归写法
// curNode指向当前正在遍历的节点
// 到了curNode首先输出curNode->val
// 然后看看curNode是否存在孩子
//     如果存在孩子,那么curNode压入栈,curNode变成curNode->child
//     如果不存在孩子,取出栈顶元素
//         如果栈顶元素还有其它的孩子,curNode=curNode->其它孩子,(记录当前遍历)到的孩子的位置
//         如果没有其它孩子了,再重复取出栈顶元素

struct MyNode{
    Node*node=NULL;
    int pos=0;//指向当前遍历到哪一个孩子,pos这个地点的孩子还没有被遍历
    MyNode(){}
    MyNode(Node*_node,int _pos){
        node=_node;
        pos=_pos;
    }
};

class Solution {
public:
    stack<MyNode>sta;
    vector<int>res;
    vector<int> preorder(Node* root) {
        if(root==NULL){
            return vector<int>();
        }

        MyNode curMyNode(root,0);
        sta.push(curMyNode);        // 第一次入栈的时候记录结果
        res.push_back(root->val);   // 
        // cout<<"111"<<endl;
        MyNode childMyNode;         // 当前节点的孩子节点
        while(!sta.empty()){
            curMyNode=sta.top();    // 当前的节点
            // cout<<curMyNode.node->val<<endl;
            // 当前的节点如果是空节点
            // if(curMyNode.node==NULL){
            //     sta.pop();
            //     continue;
            // }
            int &posChild=curMyNode.pos;  //当前遍历到的孩子的位置
            vector<Node*>&children=curMyNode.node->children;//当前的孩子节点的vector
            if(posChild<children.size()){
                // 栈顶的元素的遍历到的儿子的位置++
                posChild++;
                sta.pop();
                sta.push(curMyNode);

                // 准备好非空孩子节点并压入栈顺便记录结果
                childMyNode.node=children[posChild-1];//刚刚posChild++了
                childMyNode.pos=0;
                if(childMyNode.node!=NULL){
                    sta.push(childMyNode);
                    res.push_back(children[posChild-1]->val);//第一次进栈压入值
                }
                continue;
            }
            else{
                // 当前的遍历完了
                sta.pop();
                continue;
            }
        }
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值