前序遍历
在前序遍历中,根节点最先访问,因此可以直接用栈来保存需要递归访问的两个子树。右子树后访问,因此先入栈右子树。
1 | vector<int> preorderTraversal(TreeNode* r) { |
中序遍历
在前序遍历中,因为根节点直接访问,因此不需要回溯。而中序遍历和后序遍历都需要回溯,对中序遍历而言,在回溯的过程中,按照规则若有左节点则需将左节点入栈。若刚访问了当前节点,则下一步需要访问当前节点的右节点,将右节点赋值给当前节点。这样进入下一次循环,对该右子树进行同样的操作。若该节点为空,则会弹出之前入栈的节点进行回溯,避免了重复入栈左节点。
1 | vector<int> inorderTraversal(TreeNode* root) { |
后序遍历
后序遍历与中序遍历有相同的框架,只是后序需要保证先访问右节点再访问根节点。因此在对一个节点进行访问时,需要先确认当前节点无右节点或者右节点已访问。对当前节点进行访问后需要将当前节点置空,以保证下一轮迭代时的节点是从栈中弹出的。
1 | vector<int> postorderTraversal(TreeNode* root) { |