二叉树的递归非递归实现的中序遍历

和前序遍历类似这次我们不引入多叉树的概念(因为你不能判断你在哪个中间不像二叉树,所以不引入多叉树的的中序遍历)

首先定义树的结构


struct TreeNode {
    int val ;
    TreeNode *left;
    TreeNode *right ;
    TreeNode( int _val ){
        val = _val;
        left= NULL ;
        right= NULL ; 
    }
};

接着说递归的实现


void dfs( TreeNode * root ){
    if( root == NULL)
        return ;
    dfs( root ->left );
    cout << root->val <<endl;
    dfs( root->right );

}

接着就是非递归的实现我们先说一种互联网上比较少见的思路来引导一下

就是hash+stack的方法

观察规律每次都是先往左子树递归,并且最先访问最左边的树,那么我们先把左子树推入栈中,然后当没有左子树的打印节点,但是这样有个问题–那便是当我回到根节点后仍然会把之前推进栈的节点继续推进栈-从而导致死循环所以我们加入哈希来判断之前的点是否已经打印了

vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans ;
        if( root == NULL )
            return ans ;
        stack<TreeNode *> slist ;
        map< TreeNode *, int > hash ;  //hash可能会冲突可以随便改个名

        slist.push( root ) ;
        while( slist.size() ){
            TreeNode *top = slist.top() ; 
            while( top->left && hash[top->left] == 0 ){
                slist.push(top->left);
                top = top->left ; 
            }
            ans.push_back(top->val);
            hash[top]++;
            slist.pop();
            if( top-> right ){
                slist.push(top->right ) ;
            }
        }
        return ans ; 
    }

最后说一下只用栈的实现,实际基本思路不变但是确实不是特别好想

vector<int> inorderTraversal(TreeNode* root) {
      vector<int> ans ;
      if( root == NULL )
           return ans ;
       stack<TreeNode *> slist ;
       TreeNode *cur = root  ;
       while( cur != NULL || slist.size() ){
           while( cur != NULL ){
               slist.push( cur ) ;
               cur = cur->left ;
           }
           cur = slist.top();
           slist.pop();
           ans.push_back( cur->val ) ;
           cur = cur -> right ;
       }
       return ans ; 
   }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值