迭代法后序遍历二叉树

递归法后序遍历二叉树

后续遍历一颗二叉树即按照先后续遍历左子树,再后续遍历右子树,最后遍历根节点。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。

/**
 * 下面是二叉树的定义.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
    vector<int>res;
    vector<int> postorderTraversal(TreeNode* root) {
        if(root==NULL) return res;
        if(root->left) {postorderTraversal(root->left);}   
        if(root->right) { postorderTraversal(root->right);}
         res.push_back(root->val);//每次
        return res;

迭代法后序遍历二叉树

其实迭代法就是用迭代去等价实现递归,两种方法相同,但是由于递归是会有隐式的一个需要维护的栈,而迭代是显示的去模拟这个栈,具体实现参见下面代码:

/**
 * 下面是二叉树的定义.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
vector<int> postorderTraversal(TreeNode* root) {
       vector<int>res;
       if(root==nullptr) return res;
       stack<TreeNode*>stk;
       TreeNode* prev=nullptr;
       while(root!=nullptr||!stk.empty()){
       /*第一次进循环体肯定是因为root不为空,
       但是不可以把这个root!=null这个条件去掉,
       而在进while之前让root入栈,
       因为要为了下面的while的遍历方便。
*/
         while(root!=nullptr){
         //这个循环就是每次都从当前根节点遍历它的左子树
         stk.emplace(root);
         root=root->left; 
         }
           root=stk.top();  //取栈顶元素
           stk.pop();
           if(root->right==nullptr||root->right==prev){
           /*如果当前栈顶元素没有右节点或者右节点上轮刚遍历过的节点,
           直接将根节点(栈顶元素)放入答案数组中,
           这里不需要判断该节点的左节点,因为我们是从左边节点一直 
           遍历下来的,所以要么没有左节点,要么左节点就已经遍历过了。*/
               res.emplace_back(root->val);
               prev=root;
               root=nullptr;
           }
           /*不满足上述条件的,说明其该根节点(栈顶元素)还有右节点,
           又开始后序遍历该以该节点为根的二叉树*/
           else{
               stk.emplace(root);
               root=root->right;
           }
       }
       return res;
    }

我的注释可能写的不太好,但由于本人才疏学浅,这也是没有办法的!害。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值