树的非递归遍历
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、后序遍历
未完待续。。。