C++实现二叉树的递归遍历(详细步骤与代码实现)

        我们知道数据的存储结构分为线性与非线性。线性就是1对1的结构,像栈与队列都属于线性结构。那什么是非线性的结构呢?非线性即1对n的结构这更符合常规情况,线性结构本质上属于非线性结构中的一种特殊形式,像树就属于非线性结构。但是树并不适合编码操作,需要将其转为二叉树,既然二叉树是一种数据存储的结构,那就涉及到数据遍历的问题。有关二叉树的遍历有三种方式,即先序遍历、中序遍历与后续遍历。

下面就根据上面的二叉树简单谈一下何为先序遍历、中序遍历与后序遍历:

1、先序遍历(DLR)        

        先从顶部二叉树节点A开始遍历,输出A——>寻找节点A的左子树,找到B,输出B,B为一个树继续遍历——>寻找节点B的左子树,没找到——>寻找节点B的右子树,找到节点C输出C,C为一个树继续遍历——>寻找节点C的左子树,找到D输出D,D不是一个树——>寻找节点C的右子树,找到E输出E,E不是一个树。

        顶点A节点的左子树完全访问完毕,现在访问节点A的右子树,找到F输出F,F为一个树继续遍历——>寻找节点F的左子树,没找到——>寻找节点F的右子树,找到G输出G,G为一个树继续遍历——>寻找节点G左子树,找到H直接输出,H不是一个树——>寻找节点G右子树,没找到——>遍历完成,结束。

遍历结果为:ABCDEFGH

2、中序遍历(LDR)

        先从顶部节点A开始——>寻找左子树,找到B,B为一个树——>寻找B节点左子树,没找到——>输出B——>寻找B节点右子树,找到C,C为一个树——>寻找C节点左子树,找到D,D不是一个树,输出D——>输出C——>寻找C节点右子树,找到E,E不是一个树,输出E。

        A的左子树访问完毕——>输出A——>寻找节点A的右子树,找到F,F为一个树继续遍历——>寻找节点F的左子树,没找到——>输出F——>寻找节点F的右子树,找到G,G为一个树继续遍历——>寻找节点G的左子树,找到H,H不是一个树——>输出G——>寻找G的右子树,没找到——>遍历完成,结束。

遍历结果为:BDCEAFHC

3、后序遍历(LRD)

         先从顶部节点A开始——>寻找左子树,找到B,B为一个树——>寻找B节点左子树,没找到——>寻找B节点右子树,找到C,C为一个树——>寻找节点C的左子树,找到D,D不是一个树直接输出——>寻找节点C右子树,找到E,E不是一个树直接输出——>输出节点C-——>输出节点B.

        A的左子树访问完成,寻找A的右子树,找到F,F为一个树——>寻找节点F的左子树,没找到——>寻找节点F的右子树,找到G,G为一个树——>寻找节点G的左子树,找到G,H不是一个树直接输出——>寻找节点G右子树,没找到——>输出G——>输出F——>输出A——>遍历完成,结束。

 遍历结果为:DECBHGFA

二叉树三种遍历方式就介绍到这,下面介绍如何通过代码实现:

1、先定义二叉树节点

//定义二叉树节点
class binarynode
{
public:
	char ch;			 //节点数据域
	binarynode* lchild;  //左孩子
	binarynode* rchild;  //右孩子
};

2、三种遍历方式

//递归遍历
//先序
void recursion_dlr(binarynode* root)
{
	if (root==NULL)
	{
		return;
	}
	//遍历根节点
	cout<<root->ch<<"\t";
	//遍历左子树
	recursion_dlr(root->lchild);
	//遍历右子树
	recursion_dlr(root->rchild);
}
//中序
void recursion_ldr(binarynode* root)
{
	if (root==NULL)
	{
		return;
	}
	//遍历左子树
	recursion_ldr(root->lchild);
	//遍历根节点
	cout<<root->ch<<"\t";
	//遍历右子树
	recursion_ldr(root->rchild);
}
//后序
void recursion_lrd(binarynode* root)
{
	if (root==NULL)
	{
		return;
	}
	//遍历左子树
	recursion_lrd(root->lchild);
	//遍历右子树
	recursion_lrd(root->rchild);
	//遍历根节点
	cout<<root->ch<<"\t";
}

4、创建案例中的二叉树

//创建二叉树
void createtree()
{
	//创建节点
	binarynode node1={'A',NULL,NULL};
	binarynode node2={'B',NULL,NULL};
	binarynode node3={'C',NULL,NULL};
	binarynode node4={'D',NULL,NULL};
	binarynode node5={'E',NULL,NULL};
	binarynode node6={'F',NULL,NULL};
	binarynode node7={'G',NULL,NULL};
	binarynode node8={'H',NULL,NULL};
	//建立节点关系
	node1.lchild=&node2;
	node1.rchild=&node6;
	node2.rchild=&node3;
	node3.lchild=&node4;
	node3.rchild=&node5;
	node6.rchild=&node7;
	node7.lchild=&node8;
	cout<<"先序遍历:"<<endl;
	recursion_dlr(&node1);
	cout<<endl;
	cout<<"中序遍历:"<<endl;
	recursion_ldr(&node1);
	cout<<endl;
	cout<<"后序遍历:"<<endl;
	recursion_lrd(&node1);
	cout<<endl;
}

5、遍历结果

int main()
{
	createtree();
	system("pause");
	return 0;
}

  • 10
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是C++实现完整的二叉树归遍代码: ```c++ #include <iostream> 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 << " "; // 访问当前结点 } 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); // 归遍叉树 cout << "Pre-order traversal: "; preOrderTraversal(root); cout << endl; cout << "In-order traversal: "; inOrderTraversal(root); cout << endl; cout << "Post-order traversal: "; postOrderTraversal(root); cout << endl; return 0; } ``` 在这里,我们定义了一个 `TreeNode` 结构体表示二叉树结点,并实现了三种遍方式的归函数:`preOrderTraversal`、`inOrderTraversal` 和 `postOrderTraversal`。然后在 `main` 函数中构建了一个二叉树,并分别使用这三个函数进行遍,输出遍序列。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值