sundeepblue
1/31/2014 - 9:30 PM

[tree] inorder traversal, concise iterative version

[tree] inorder traversal, concise iterative version

void in_order(TreeNode *root) {
	if(!root) return;
	stack<TreeNode*> s;
	TreeNode *curr = root;
	//s.push(curr);
	while(true) {
		if(curr) {
			s.push(curr);
			curr = curr->left;
		}
		else {
			if(s.empty()) break;
			curr = s.top(); s.pop();
			visit(curr);
			curr = curr->right;
		}
	}
}

// better version
void inorder_traversal(TreeNode *root) {
	if(!root) return;
	stack<TreeNode*> s;
	TreeNode *cur = root;  // gist, use a temp variable cur to traverse. Do not push cur into stack now.
	while(1) {
		while(cur) {
			s.push(cur);  // all elements in stack are non-NULL. 
			cur = cur->left;
		}
		if(s.empty()) break;
		cur = s.top(); 
		s.pop();
		visit(cur);
		cur = cur->right;
	}
}