树的定义
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
树的先序遍历
先序遍历的次序是 根节点->左节点->右节点
1. 递归实现
void preOrderTraversal(TreeNode* root)
{
if(!root) return;
cout << root->val << endl;
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
2. 迭代实现
void preOrderTraversal(TreeNode* root)
{
if(!root) return;
stack<TreeNode*> nodes;
TreeNode* cur = root;
while(cur || !nodes.empty())
{
while(cur)
{
// 访问节点,然后向左前进
cout << cur->val << endl;
nodes.push(cur);
cur = cur->left;
}
cur = nodes.top();
nodes.pop();
// 向右前进
cur = cur->right;
}
}
树的中序遍历
中序遍历的次序是 左节点->根节点->右节点
1. 递归实现
void inOrderTraversal(TreeNode* root)
{
if(!root) return;
inOrderTraversal(root->left);
cout << root->val << endl;
inOrderTraversal(root->right);
}
2. 迭代实现
void inOrderTraversal(TreeNode* root)
{
if(!root) return;
stack<TreeNode*> nodes;
TreeNode* cur = root;
while(cur || !nodes.empty())
{
while(cur)
{
nodes.push(cur);
cur = cur->left;
}
cur = nodes.top();
nodes.pop();
cout << cur->val << endl;
cur = cur->right;
}
}
树的后序遍历
后序遍历的次序是 左节点->右节点->根节点
1. 递归实现
void postOrderTraversal(TreeNode* root)
{
if(!root) return;
postOrderTraversal(root->left);
postOrderTraversal(root->right);
cout << root->val << endl;
}
2. 迭代实现
void postOrderTraversal(TreeNode* root)
{
if(!root) return;
stack<TreeNode*> nodes;
TreeNode* prev = nullptr;
TreeNode* cur = nullptr; //初始化
nodes.push(root);
while(!nodes.empty())
{
cur = nodes.top(); //将栈顶元素赋给cur
if(!prev || prev->left == cur || prev->right == cur) //若prev为NULL或是cur的父节点
{
if(cur->left)
nodes.push(cur->left);
else if(cur->right)
nodes.push(cur->right);
}
else if(cur->left == prev) //若prev是cur的左儿子
{
if(cur->right)
nodes.push(cur->right);
}
else
{
cout << cur->val << endl; //访问当前节点
nodes.pop(); //访问后弹出
}
prev = cur; //处理完当前节点后将cur节点变为prev节点
}
}
树的层次遍历
层次遍历,也相当于广度优先遍历,需要使用队列存储各节点
void levelTraversal(TreeNode* root)
{
if(!root) return;
queue<TreeNode*> nodes;
nodes.push(root);
while(!nodes.empty())
{
TreeNode* cur = nodes.front();
nodes.pop();
cout << cur->val << endl;
if(cur->left)
nodes.push(cur->left);
if(cur->right)
nodes.push(cur->right);
}
}