树的非递归遍历

Reference:浙大数据结构慕课

 

 

1、非递归中序遍历

1)定义一个栈。

2)一直向左节点访问,将访问到的节点入栈,直到节点为空。

3)栈顶pop出一个节点,指针指向其右节点,重复上述过程。

code:

 1 bool inOrder(TreeNode *root) {
 2     stack<TreeNode *> s;
 3          
 4     while (root || !s.empty()) {
 5         while (root) {
 6             s.push(root);
 7             root = root->left;
 8         }
 9         root = s.top();
10         s.pop();
11         cout << root->val; //中序
12         root = root->right;
13     }
14     return valid;
15 }

注意循环结束的判断条件不能只是 !s.empty(),因为当pop出根节点后,root指向根节点的右节点,此时栈为空。

也不能只是root,因为当pop出某节点,且此节点无右节点时,root为空。

2、前序遍历

只需把访问节点的位置改一下,其余和中序遍历相同:

code:

 1 bool isValidBST(TreeNode *root) {
 2     stack<TreeNode *> s;
 3          
 4     while (root || !s.empty()) {
 5         while (root) {
 6             cout << root->val; //前序遍历
 7             s.push(root);
 8             root = root->left;
 9         }
10         root = s.top();
11         s.pop();
12         root = root->right;
13     }
14     return valid;
15 }

3、后序遍历

未完待续。。。

posted @ 2020-04-03 20:28  bloglxc  阅读(300)  评论(2编辑  收藏  举报