网址:https://leetcode.com/problems/binary-tree-inorder-traversal/
参考:https://leetcode.com/problems/binary-tree-inorder-traversal/solution/
二叉树的遍历一般有两种办法:递归、通过栈进行迭代。此外,还有通过模拟线索二叉树进行遍历的方式。
递归的代码十分简单,这里就不再赘述。
中序遍历迭代遍历算法:
- 遇到一个节点,就把它圧栈,并去遍历它的左子树
- 当左子树遍历结束后,从栈顶弹出这个节点并访问它
- 然后再去中序遍历它的右子树
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> ans; stack<TreeNode*> temp; while( root || !temp.empty()) { while(root) { temp.push(root); root = root->left; } if(!temp.empty()) { root = temp.top(); temp.pop(); ans.push_back(root->val); root = root->right; } } return ans; } };
“线索”二叉树:
在这里我们不必为节点添加额外的指针域来表示节点的某种遍历顺序的前后位置分别是什么节点,
而是通过以线索二叉树的思想遍历二叉树,把树直接改造成可直接向下遍历的结构。
具体可见:https://leetcode.com/problems/binary-tree-inorder-traversal/solution/
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> ans; TreeNode* temp = new TreeNode(0); // 因为我们不断让root=root->right,所以判断条件为root != NULL while(root != NULL) { // root有左子树,就把root修改为左子树的最右节点的右节点 if(root->left) { // 得到root左子树的最右节点 temp = root->left; while(temp->right != NULL) { temp = temp->right; } // 把root修改为左子树的最右节点的右节点 temp->right = root; // 注意要把root节点的左节点置为NULL! // 在这之前先存下root的左节点,然后修改root,进行下一轮while循环 temp = root->left; root->left = NULL; root = temp; } else { // root没有左子树,说明当前节点是当前树中的最左节点 // 根据中序遍历的定义,把val存入ans,继续while循环 ans.push_back(root->val); root = root->right; } } return ans; } };