二叉树前中后序遍历(C++)

朋友们,hello呀,今天我们讲一下二叉树的遍历方法。

所谓二叉树,就是树形结构中比较特殊的一种,它满足每个节点的度最多为2,也就是最多有两个分叉,这两个分叉分别称为左子树右子树(也称为该节点的两个孩子)。一般来说,左右子树具有严格的顺序性,绝对不能轻易颠倒位置。

二叉树分为空二叉树非空二叉树节点数为0的二叉树称为空二叉树,简称空树;否则为非空树,非空树有且仅有一个根节点。

二叉树节点的定义

typedef struct Binode {//定义二叉树节点
	char data;
	Binode* lkid, *rkid;
}*Node;

注意每个二叉树节点包括数据域左右子树的指针域

二叉树的建立

下面我们以【前序输入创建二叉树】为例介绍二叉树的创建过程

因为每个二叉树节点的左右子树的指针域可能为NULL,为了显示出来,我们用字符‘#’表示

我们以下述二叉树为例讲解

右图就是我们将空指针域改为#表示的结果

前序遍历遍历顺序:根-左-右

中序遍历遍历顺序:左-根-右

后序遍历遍历顺序:左-右-根

有了上述规则,我们不难得出前序遍历该二叉树的拓展树的结果为AB#D##C##

我们有了如下代码:

void createBitree(Node&T)//按前序输入创建二叉树
{
	char ch;
	cin >> ch;
	if (ch == '#')T = NULL;//如果为#,设置为空
	else{
		T = new Binode;
		T->data = ch;//否则,字符存入数据域中
		createBitree(T->lkid);//建立左子树
		createBitree(T->rkid);//建立右子树
	}
}

不难发现,二叉树的建立是依靠递归来完成的,而递归顺序与我们选择用哪种方式建立二叉树有关,比如,如果我们选择用中序方式建立二叉树,核心代码应改为:

createBitree(T->lkid);//建立左子树
T->data = ch;//字符存入数据域中
createBitree(T->rkid);//建立右子树

这和我们中序遍历[左-根-右]的顺序是完全一致的。

二叉树前中后序遍历

有了前面的基础,我们知道了遍历操作递归的顺序,那么遍历二叉树就不难了

前序遍历二叉树】为例,代码如下:

void preorder(Node &T)//前序遍历二叉树
{
	if (!T)return;
	cout << T->data;//输出节点信息,也可以是其他操作
	preorder(T->lkid);//遍历左子树
	preorder(T->rkid);//遍历右子树
}

很精简,是不是?这就是递归的好处。这里再插一嘴,为什么考虑用递归呢,其实,你想一下,二叉树就是按照递归方式定义的呀!好一个返璞归真!

二叉树定义如下:

二叉树(Binary Tree)是n(n≥0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。

整体代码如下:

#include <iostream>
using namespace std;
typedef struct Binode {//定义二叉树节点
	char data;
	Binode* lkid, *rkid;
}*Node;
void createBitree(Node&T)//按前序输入创建二叉树
{
	char ch;
	cin >> ch;
	if (ch == '#')T = NULL;
	else{
		T = new Binode;
		T->data = ch;
		createBitree(T->lkid);
		createBitree(T->rkid);
	}
}
//AB#D##C##
void preorder(Node &T)//前序遍历二叉树
{
	if (!T)return;
	cout << T->data;
	preorder(T->lkid);
	preorder(T->rkid);
}
void inorder(Node& T)//中序遍历二叉树
{
	if (!T)return;
	inorder(T->lkid);
	cout << T->data;
	inorder(T->rkid);
}
void postorder(Node& T)//后序遍历二叉树
{
	if (!T)return;
	postorder(T->lkid);
	postorder(T->rkid);
	cout << T->data;
}
int main()
{
	Binode* root =NULL;
	createBitree(root);//创建二叉树
	cout << "前序遍历:";
	preorder(root);
	cout << endl;
	cout << "中序遍历:";
	inorder(root);
	cout << endl;
	cout << "后序遍历:";
	postorder(root);
	cout << endl;
	system("pause");
	return 0;
}

输入及输出结果:

好了,今天的分享就到这里,感谢观看,如果喜欢,记得关注哦!

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是二叉树前中后序遍历C++ 代码: ```c++ #include <iostream> #include <stack> using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; // 序遍历 void preorderTraversal(TreeNode* root) { if (root == NULL) return; cout << root->val << " "; preorderTraversal(root->left); preorderTraversal(root->right); } // 序遍历 void inorderTraversal(TreeNode* root) { if (root == NULL) return; inorderTraversal(root->left); cout << root->val << " "; inorderTraversal(root->right); } // 后序遍历 void postorderTraversal(TreeNode* root) { if (root == NULL) return; postorderTraversal(root->left); postorderTraversal(root->right); cout << root->val << " "; } // 非递归序遍历 void preorderTraversalNonRecursive(TreeNode* root) { if (root == NULL) return; stack<TreeNode*> s; s.push(root); while (!s.empty()) { TreeNode* curr = s.top(); s.pop(); cout << curr->val << " "; if (curr->right != NULL) s.push(curr->right); if (curr->left != NULL) s.push(curr->left); } } // 非递归序遍历 void inorderTraversalNonRecursive(TreeNode* root) { if (root == NULL) return; stack<TreeNode*> s; TreeNode* curr = root; while (curr != NULL || !s.empty()) { while (curr != NULL) { s.push(curr); curr = curr->left; } curr = s.top(); s.pop(); cout << curr->val << " "; curr = curr->right; } } // 非递归后序遍历 void postorderTraversalNonRecursive(TreeNode* root) { if (root == NULL) return; stack<TreeNode*> s1, s2; s1.push(root); while (!s1.empty()) { TreeNode* curr = s1.top(); s1.pop(); s2.push(curr); if (curr->left != NULL) s1.push(curr->left); if (curr->right != NULL) s1.push(curr->right); } while (!s2.empty()) { cout << s2.top()->val << " "; s2.pop(); } } int main() { TreeNode* root = new TreeNode(1); root->left = new TreeNode(2); root->right = new TreeNode(3); root->left->left = new TreeNode(4); root->left->right = new TreeNode(5); root->right->left = new TreeNode(6); root->right->right = new TreeNode(7); cout << "Preorder traversal: "; preorderTraversal(root); cout << endl; cout << "Inorder traversal: "; inorderTraversal(root); cout << endl; cout << "Postorder traversal: "; postorderTraversal(root); cout << endl; cout << "Non-recursive preorder traversal: "; preorderTraversalNonRecursive(root); cout << endl; cout << "Non-recursive inorder traversal: "; inorderTraversalNonRecursive(root); cout << endl; cout << "Non-recursive postorder traversal: "; postorderTraversalNonRecursive(root); cout << endl; return 0; } ``` 输出结果为: ``` Preorder traversal: 1 2 4 5 3 6 7 Inorder traversal: 4 2 5 1 6 3 7 Postorder traversal: 4 5 2 6 7 3 1 Non-recursive preorder traversal: 1 2 4 5 3 6 7 Non-recursive inorder traversal: 4 2 5 1 6 3 7 Non-recursive postorder traversal: 4 5 2 6 7 3 1 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值