您的位置:首页 > 其它

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

2018-01-24 19:30 260 查看
和前序遍历类似这次我们不引入多叉树的概念(因为你不能判断你在哪个中间不像二叉树,所以不引入多叉树的的中序遍历)

首先定义树的结构

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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐