问题描述
中序遍历二叉树时,很简单,需要加上递归就可以优雅地实现了。当然,使用递归的话,函数调用栈的空间就会达到O(log n)
。那么有什么方式,可以使得中序遍历二叉树的复杂度为O(1)
呢?
问题分析
既然要保证O(1)
复杂度,那么就不能使用递归调用了。目标方案应该是使用while
或for
循环的方式。下面借用一张图来解释(来源:http://www.2cto.com/kf/201402/277873.html):
如图所示,需要在多个节点(right指针为空),设置指针指向父节点。这样在遍历的时候,就可以依靠这个指针来返回父节点了。在遍历完后,这些辅助指针会被撤去。
解决方案
这里直接用代码表示出来:
class TreeNode {
public:
int val;
TreeNode *left, *right;
TreeNode(int val) {
this->val = val;
this->left = this->right = NULL;
}
};
void inorderConstSpace(TreeNode *root) {
while (root != NULL) {
// if left child is NULL, then just visit root and continue
if (root->left == NULL) {
printf("%d\n", root->val);
root = root->right;
continue;
}
// find preceding node
TreeNode *pre = NULL;
for (pre = root->left; pre->right != root && pre->right != NULL;
pre = pre->right) {}
// if the preceding node is visited for the first time
if (pre->right == NULL) {
pre->right = root;
root = root->left;
} else {
// preceding node is visited for the second time
printf("%d\n", root->val);
root = root->right;
pre->right == NULL;
}
}
}
时间: 2024-10-11 04:14:38