0、二叉树数据结构定义
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x): val(x), left(NULL), right(NULL) {}
};
1、二叉树遍历的递归法
二叉树遍历的递归法比较简单,这里直接贴出代码。
先序遍历——按照“根节点-左孩子-右孩子”的顺序进行访问。
vector<int> pre_Traversal_Recursive(TreeNode* root)
{
vector<int> result;//存放遍历之后结点的值
pre_Traversal_Recursive_core(root, result);
return result;
}
void pre_Traversal_Recursive_core(TreeNode* node, vector<int> &result)
{
if (!node) return;
result.push_back(node->val);
pre_Traversal_Recursive_core(node->left, result);
pre_Traversal_Recursive_core(node->right, result);
}
这里是根据LeetCode上的要求写的,因为需要一个vector容器返回遍历的结果,所以这里使用了两个函数实现。
中序遍历——按照“
左孩子
-
根节点-右孩子”的顺序进行访问。
vector<int> in_Traversal_Recursive(TreeNode* root)
{
vector<int> result;//存放遍历之后结点的值
pre_Traversal_Recursive_core(root, result);
return result;
}
void in_Traversal_Recursive_core(TreeNode* node, vector<int> &result)
{
if (!node) return;
pre_Traversal_Recursive_core(node->left, result);
result.push_back(node->val);
pre_Traversal_Recursive_core(node->right, result);
}
后序遍历——按照“左孩子-右孩子-根节点”的顺序进行访问。
vector<int> post_Traversal_Recursive(TreeNode* root)
{
vector<int> result;//存放遍历之后结点的值
pre_Traversal_Recursive_core(root, result);
return result;
}
void post_Traversal_Recursive_core(TreeNode* node, vector<int> &result)
{
if (!node) return;
pre_Traversal_Recursive_core(node->left, result);
pre_Traversal_Recursive_core(node->right, result);
result.push_back(node->val);
}
2、用栈来实现二叉树的非递归遍历
先序遍历的非递归实现
先序遍历原理:对于任一结点P,
1)输出节点P,然后将其入栈,再看P的左孩子是否为空;2)若P的左孩子不为空,则置P的左孩子为当前节点,重复1)的操作;3)若P的左孩子为空,则将栈顶节点出栈,但不输出,并将出栈节点的右孩子置为当前节点,看其是否为空;4)若不为空,则循环至1)操作;5)如果为空,则继续出栈,但不输出,同时将出栈节点的右孩子置为当前节点,看其是否为空,重复4)和5)操作;