struct TreeNode {
TreeNode* left;
TreeNode* right;
int val;
TreeNode(int x) {
val = x;
left = nullptr;
right = nullptr;
}
};
/*
* 前序遍历 递归
*/
void preOrderRecursive(TreeNode* root) {
if (!root) return;
cout << root->val << ", ";
preOrderRecursive(root->left);
preOrderRecursive(root->right);
}
/*
* 前序遍历 非递归
*/
void preOrderIterative(TreeNode* root) {
if (!root) return;
stack<TreeNode*> s;
while (!s.empty() || root) {
while (root) {
cout << root->val << ", ";
s.push(root);
root = root->left;
}
if (!s.empty()) {
TreeNode* node = s.top();
s.pop();
if (node->right) root = node->right;
}
}
}
/*
* 中序遍历 递归
*/
void inOrderRecursive(TreeNode* root) {
if (!root) return;
inOrderRecursive(root->left);
cout << root->val << ", ";
inOrderRecursive(root->right);
}
/*
* 中序遍历 非递归
*/
void inOrderIterative(TreeNode* root) {
if (!root) return;
stack<TreeNode*> s;
while (!s.empty() || root) {
while (root) {
s.push(root);
root = root->left;
}
if (!s.empty()) {
TreeNode* node = s.top();
s.pop();
cout << node->val << ", ";
if (node->right) root = node->right;
}
}
}
/*
* 后续遍历 递归
*/
void postOrderRecursive(TreeNode* root) {
if (!root) return;
postOrderRecursive(root->left);
postOrderRecursive(root->right);
cout << root->val << ", ";
}
/*
* 后续遍历 非递归
*/
void postOrderIterative(TreeNode* root) {
if (!root) return;
stack<TreeNode*> s;
TreeNode* visited = nullptr;
while (!s.empty() || root) {
while (root) {
s.push(root);
root = root->left;
}
root = s.top();
if (root->right == nullptr || root->right == visited) {
cout << root->val << " ,";
s.pop();
visited = root;
root = nullptr;
} else {
root = root->right;
}
}
}
/*
* 层序遍历 递归
*/
int height(TreeNode* root) {
if (!root) return 0;
int left = 1 + height(root->left);
int right = 1 + height(root->right);
return left > right ? left : right;
}
void levelOrderRecursiveInternal(TreeNode* root, int level) {
if (!root) return;
if (level == 1) {
cout << root->val << " ,";
}
levelOrderRecursiveInternal(root->left, level - 1);
levelOrderRecursiveInternal(root->right, level - 1);
}
void levelOrderRecursive(TreeNode* root) {
if (!root) return;
int h = height(root);
for (int i = 1; i <= h; i++) {
levelOrderRecursiveInternal(root, i);
}
}
/*
* 层序遍历 非递归
*/
void levelOrderIterative(TreeNode* root) {
if (!root) return;
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode* node = s.top();
s.pop();
cout << node->val << " ,";
if (node->left) {
s.push(node->left);
}
if (node->right) {
s.push(node->right);
}
}
}
int main() {
TreeNode* root = new TreeNode(3);
root->left = new TreeNode(2);
root->right = new TreeNode(4);
root->left->left = new TreeNode(1);
root->left->right = new TreeNode(5);
root->right->right = new TreeNode(10);
cout << endl << "***** pre order *****" << endl;
preOrderRecursive(root);
cout << endl << "*****" << endl;
preOrderIterative(root);
cout << endl << "*****" << endl;
cout << endl << "***** in order *****" << endl;
inOrderRecursive(root);
cout << endl << "*****" << endl;
inOrderIterative(root);
cout << endl << "*****" << endl;
cout << endl << "***** post order *****" << endl;
postOrderRecursive(root);
cout << endl << "*****" << endl;
postOrderIterative(root);
cout << endl << "*****" << endl;
cout << endl << "***** level order *****" << endl;
levelOrderRecursive(root);
cout << endl << "*****" << endl;
levelOrderIterative(root);
cout << endl << "*****" << endl;
// i = 3, j = 6 // a, 6
}
2019-06-25 树的遍历 递归非递归
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一、生成二叉树 新建一个类: 生成二叉树方法: 生成二叉树: 二、前序遍历 前序遍历:访问顺序是【根节点】-【左孩...