作者:濮阳土著_480 | 来源:互联网 | 2023-05-26 15:43
二叉树如上图所示。一、递归遍历二、非递归遍历要借助栈或队列初始化把根节点压栈,访问根节点并弹出,然后依次将右节点、左节点入栈,直到栈为空。思路:回溯。访问根节点的左孩子,访问左孩子

二叉树如上图所示。
一、递归遍历
#include
#include
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x): val(x), left(NULL), right(NULL) {}
};
// 先序遍历,递归
// [1] [2] [4] [5] [6] [7] [3]
void preorder1(TreeNode* root) {
if(!root) return;
cout <<‘[‘ <val <<"] ";
preorder1(root->left);
preorder1(root->right);
}
// 中序遍历,递归
// [4] [2] [6] [5] [7] [1] [3]
void inorder1(TreeNode* root) {
if(!root) return;
inorder1(root->left);
cout <<‘[‘ <val <<"] ";
inorder1(root->right);
}
// 后序遍历,递归
// [4] [6] [7] [5] [2] [3] [1]
void postorder1(TreeNode* root) {
if(!root) return;
postorder1(root->left);
postorder1(root->right);
cout <<‘[‘ <val <<"] ";
}
二、非递归遍历
要借助栈或队列
// 先序遍历,非递归
void preorder2(TreeNode* root) {
if(!root) return;
stack s;
s.push(root);
while(!s.empty()) {
TreeNode* node = s.top();
cout <<‘[‘ <val <<"] ";
s.pop();
if(node->right) s.push(node->right);
if(node->left) s.push(node->left);
}
}
初始化把根节点压栈,访问根节点并弹出,然后依次将右节点、左节点入栈,直到栈为空。
// 先序遍历,非递归
void preorder3(TreeNode* root) {
stack s;
while(root != NULL || !s.empty()) {
if(root != NULL) {
s.push(root);
cout <<‘[‘ <val <<"] ";
root = root->left;
}
else {
root = s.top();
s.pop();
root = root->right;
}
}
}
思路:回溯。访问根节点的左孩子,访问左孩子的左孩子,直到左孩子为空,这个过程中把所有访问过的节点压栈,当左孩子为空,pop该节点,访问该节点的右孩子。空间复杂度O(logN) 和树的深度有关。时间复杂度O(N),所有节点都访问了一遍。
二叉树的遍历-递归-非递归