C语言实现树与二叉树的转换,树的前序、后序的递归算法和非递归算法

本文详细介绍了如何在C语言中将树转换为二叉树,并提供了树的前序、后序和层次序遍历的递归与非递归算法实现。这些算法包括前序遍历的递归与非递归方法,后序遍历的递归与非递归方法,以及层次序遍历的非递归方法。此外,还提到了如何利用前序遍历建立树结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言实现树与二叉树的转换

C语言实现树与二叉树的转换,可以通过将树的每个节点的左右子树,分别放在它的左右指针中,即可实现。


一、树的前序、后序的递归算法

1.1 前序遍历:

从根节点开始,先访问根节点,再访问其左子树,最后访问其右子树。
递归实现:

				void preOrder(Node* root) {	
					if (root == NULL)  return;	
					printf("%d ", root->data);
					preOrder(root->left);
					preOrder(root->right); 
				} 

1.2 后序遍历:

从根节点开始,先访问其左子树,再访问其右子树,最后访问根节点。
递归实现:

				void postOrder(Node* root) {
					if (root == NULL)         return;
					postOrder(root->left);
					postOrder(root->right);
					printf("%d ", root->data);
				}

二、树的前序、后序的非递归算法实现:

2.1 前序遍历:

从根节点开始,先访问根节点,再访问其左子树,最后访问其右子树。
非递归实现:

				void preOrderNonRecursive(Node* root) {
					if (root == NULL) return;
					stack> s; 
					s.push(root);
					while (!s.empty()){
						Node* curr = s.top();
						s.pop();
						printf ("%d ", curr->data);
						if (curr->right) s.push(curr->right);
						if (curr->left)  s.push(curr->left);
					}
				} 

2.2后序遍历:

从根节点开始,先访问其左子树,再访问其右子树,最后访问根节点。
非递归实现:

				void postOrderNonRecursive(Node* root) {
					if (root == NULL) return;
					stack> s1, s2;
					s1.push(root);
					Node* node;   
					while (!s1.empty()){
						node = s1.top();
						s1.pop();
						s2.push(node);
						if (node->left)
						s1.push(node->left); 
						if (node->right)
						s1.push(node->right);  
					}    
					while (!s2.empty()){   
						node = s2.top();     
						s2.pop();       
						printf("%d ", node->data);
					} 
				} 

三、层次序的非递归算法实现:

3.1非递归实现:从根节点开始,按照层次从上到下遍历每个节点,从左到右访问。

				void levelOrder(Node* root) {   
					if (root == NULL)      return; 
					queue> q;    
					q.push(root);  	
					while (!q.empty()){   
						int n = q.size();     
						for (int i = 0; i < n; i++){ 
							Node* curr = q.front();        
							q.pop();            
							printf("%d ", curr->data);   
							if (curr->left) q.push(curr->left);      
							if (curr->right) q.push(curr->right);  
						}     
						printf("\n");    
					} 
				}

总结

建树的实现:
可以使用前序遍历的方法,先将根节点放进树中,然后依次将左右子树放进树中,以此类推,即可建立一棵树。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值