1 二叉树前序后序中序遍历 递归非递归解法
2 二叉树层序遍历;二叉树zigzag层序遍历
3 从中序和前序重建二叉树;从中序和后序重建二叉树
1 二叉树前序后序中序遍历
- 二叉树前序遍历,前序遍历方法是先访问根节点,然后再访问左右节点。
前序遍历的递归和非递归解法:
//前序递归遍历
void preOrderRec(TreeNode *root)
{
if(root == NULL) return;
visit(root);
preOrder(root->left);
preOrder(root->right);
}
//前序非递归遍历
void preOrder(TreeNode *root)
{
stack<TreeNode *> s;
while ((NULL != root) || !s.empty())
{
if (NULL != root)
{
visit(root);
s.push(root);
root = root->left;
}
else
{
root = s.top();
s.pop();
root = root->right;
}
}
}
- 二叉树中序遍历
中序遍历是先访问左子树,然后访问根节点,最后访问右子树
//递归中序遍历
void inorderTraversal(TreeNode *root)
{
if(root == NULL) return;
inorderTraversal(root->left);
visit(root);
inorderTraversal(root->right);
}
//非递归中序遍历
vector<int> inorderTraversal(TreeNode *root) {
vector<int> result;
vector<TreeNode*> Stack;
if(root == NULL)
return result;
TreeNode * current = root;
while(current != NULL || !Stack.empty())
{
if(current != NULL){
//左子树压入栈内
Stack.push_back(current);
current = current->left;
}
else
{
current = Stack.back();
Stack.pop_back();
result.push_back(current->val);
current = current->right;
}
}
return result;
}
- 二叉树后序遍历
按照左-右-中的顺序访问,第一次遇到右节点的时候先入栈,并不访问,等到后序先把对应的左节点访问之后,才能轮到右节点,所以使用flag进行标记。