二叉树遍历
先序遍历
递归版
void preorderR(TreeNode* root) {
if (root != nullptr) {
// 在这里添加你要进行的操作,比如显示节点数据
visit(root);
preorder(root->left);
preorder(root->right);
}
}
非递归版
需要使用新建一个栈将结点元素按规则存入栈中。代码如下:
void preorder(TreeNode* root) {
if (root != nullptr) {
// 用来存储结点
stack<TreeNode*> treeNode;
TreeNode* p;
// 将根结点入栈
treeNode.push(root);
// 如果栈不为空
while(!treeNode.empty()) {
// 将栈顶元素取出来
p = treeNode.top();
visit(p);
treeNode.pop();
// 因为先序遍历左节点早于右节点,所有右节点先入栈
if (p->right != nullptr) {
treeNode.push(p->right);
}
if (p->left != nullptr) {
treeNode.push(p->left);
}
}
}
}
中序遍历
递归版
void inorderR(TreeNode* root) {
if (root != nullptr) {
inorderR(root->left);
// 在这个地方做想要的操作,比如输出结点的值
visit(root);
inorderR(root->right);
}
}
非递归版
过程如下:
- 开始根节点入栈;
- 循环执行如下步骤:
- 如果栈顶元素的左孩子存在,则左孩子入栈;
- 如果栈顶元素的左孩子不存在,则出栈并输出栈顶结点,然后检查其右孩子是否存在,如果存在,则右孩子入栈。
void inorder(TreeNode* root) {
if (root != nullptr) {
stack<TreeNode*> treeNode;
TreeNode* p = root;
while(!treeNode.empty() || p != nullptr) {
while(p != nullptr) {
treeNode.push(p);
p = p->left;
}
if (!treeNode.empty()) {
p = treeNode.top();
visit(p);
treeNode.pop();
p = p->right;
}
}
}
}
后序遍历
递归版
void postorderR(TreeNode* root) {
if (root != nullptr) {
postorderR(root->left);
postorderR(root->right);
visit(p);
}
}
非递归版
void postorder(TreeNode* root) {
if (root != nullptr){
stack<TreeNode*> treeNode1;
stack<TreeNode*> treeNode2;
TreeNode* p;
// 根结点入栈1
treeNode1.push(root);
while(!treeNode1.empty()) {
// 栈1 栈顶元素出栈
p = treeNode1.top();
treeNode1.pop();
// 将出栈元素压入栈 2
treeNode2.push(p);
// 判断出栈元素是否有左右孩子
if (p->left != nullptr)
treeNode1.push(p->left);
if (p->right != nullptr)
treeNode1.push(p->right);
}
while (!treeNode2.empty()) {
// 栈 2 出栈顺序就是后序遍历顺序
p = treeNode2.top();
visit(p);
treeNode2.pop();
}
}
}