二叉树的四种遍历方式(非递归和递归)

二叉树的四种遍历方式

二叉树的创建--先序非递归创建

#include<iostream>
#include<stack>
#include<queue>
#include<stdlib.h>

const int OK = 1;
const int ERROR = 0;

using namespace std;
typedef struct TreeNode{
	int data;
	struct TreeNode *lchild,*rchild;
}TreeNode;

void print(int data)
{
	cout<<"-->"<<data<<" ";
}


TreeNode *creat_tree(int *arr,int size)
{
	TreeNode *root,*pos,*father;
	if(size < 1)
		return NULL;
	stack<TreeNode *> st;
	root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
	root->data = arr[0];
	root->lchild = root->rchild = NULL;
	pos = root;
	st.push(pos);
	int i = 1;

	while(i < size && !st.empty()){
		while(i < size && arr[i] != -1){
			pos = (struct TreeNode *)malloc(sizeof(TreeNode));
			pos->data = arr[i];
			pos->lchild = pos->rchild = NULL;
			father = st.top();
			father->lchild = pos;
			st.push(pos);
			i++;
		}
		
		father = st.top();
		st.pop();
		if(++i < size && arr[i]!= -1){
			pos = (struct TreeNode *)malloc(sizeof(TreeNode));
			pos->data = arr[i];
			pos->lchild = pos->rchild = NULL;
			father->rchild = pos;
			st.push(pos);
			i++;
		}
		else{
			while(i < size && arr[i] == -1 && !st.empty()){
			
				father = st.top();
				st.pop();
				i++;
				if(i < size && arr[i]!= -1){
					pos = (struct TreeNode *)malloc(sizeof(TreeNode));
					pos->data = arr[i];
					pos->lchild = pos->rchild = NULL;
					father->rchild = pos;
					st.push(pos);
					i++;
					break;
				}
				
			}
		}
	}	

	return root;
}

先序遍历

递归实现

int pre_traver(TreeNode *bt)
{
	if(NULL == bt)
		return OK;
	print(bt->data);
	pre_traver(bt->lchild);
	pre_traver(bt->rchild);
}

非递归实现

int pre_traver2(TreeNode *bt)
{
	if(NULL == bt){
		cout<<"tree is empty!\n";
		return OK;
	}
	
	TreeNode *pos = bt;
	stack<TreeNode *> st;
	while(bt || !st.empty()){
		while(bt){
			print(bt->data);
			st.push(bt);
			bt = bt->lchild;
		}
		bt = st.top();
		st.pop();
		bt = bt->rchild;
	}
	
	return OK;
}


中序遍历


递归实现

int inorder_traver1(TreeNode *bt)
{
	if(NULL == bt)
		return OK;
	inorder_traver1(bt->lchild);
	print(bt->data);
	inorder_traver1(bt->rchild);
}


非递归实现

int inorder_traver2(TreeNode *bt)
{
	if(NULL == bt){
		cout<<"tree is empty\n";
		return OK;
	}
	stack<TreeNode *> st;
	while(bt || !st.empty()){
		while(bt){
			st.push(bt);
			bt = bt->lchild;
		}
		bt = st.top();
		st.pop();
		print(bt->data);
		bt = bt->rchild;
	}
	
	return OK;
}

后序遍历

递归实现

int post_traver1(TreeNode *bt)
{
	if(NULL == bt)
		return OK;
	post_traver1(bt->lchild);
	post_traver1(bt->rchild);
	print(bt->data);

}

非递归实现

int post_traver2(TreeNode *bt)
{
	if(NULL == bt){
		cout<<"tree is empty\n";
		return OK;
	}
	
	stack<TreeNode *> st;
	stack<int>   flag;
	int first = 1,second = 2;
	
	while(bt || !st.empty()){
		while(bt){
			st.push(bt);
			flag.push(first);
			bt = bt->lchild;
		}
		
		if(1 == flag.top()){
			flag.pop();
			flag.push(second);
			bt = st.top();
			bt = bt->rchild;
		}
		else{
			while(!flag.empty() && 2 == flag.top()){
				flag.pop();
				bt = st.top();
				st.pop();
				print(bt->data);
			}
			bt = NULL;
		}
	}
	return OK;
}


层次遍历

代码实现

int level_traver(TreeNode *bt)
{
	if(NULL == bt){
		cout<<"tree is empty\n";
		return OK;
	}
	queue<TreeNode *> que;
	que.push(bt);
	while(!que.empty()){
		bt = que.front();
		que.pop();
		print(bt->data);
		if(bt->lchild)
			que.push(bt->lchild);
		if(bt->rchild)
			que.push(bt->rchild);
	}
	return OK;
	
}

测试代码

int main(int argc, char **argv)
{
	int arr[] = {1,2,3,-1,4,-1,-1,-1,5,6,-1,-1,7,8,-1,-1,-1};
	int size = sizeof(arr)/sizeof(int);
	TreeNode *root;
	
	root = creat_tree(arr,size);
	cout<<"pre--traver: ";
	pre_traver2(root);
	cout<<endl;
	
	cout<<"inorder--traver: ";
	inorder_traver2(root);
	cout<<endl;
	
	cout<<"post--traver: ";
	//post_traver1(root);
	post_traver2(root);
	cout<<endl;
	
	cout<<"level--traver: ";
	level_traver(root);
	cout<<endl;
	
	//cout<<"tree--node: "<<count_tree(root)<<endl;
	//cout<<"tree--depth: "<<depth_tree(root)<<endl;
	
	return 0;
}



二叉树遍历有三种方式:前序遍历、中序遍历和后序遍历。其中,递归遍历是比较常见的方式,而非递归遍历则需要借助栈的数据结构实现。 下面给出二叉树递归遍历非递归遍历的C语言代码实现: 1. 二叉树递归遍历 前序遍历: ``` void preorderTraversal(TreeNode* root) { if (root == NULL) { return; } printf("%d ", root->val); // 访问根节点 preorderTraversal(root->left); // 递归遍历左子树 preorderTraversal(root->right); // 递归遍历右子树 } ``` 中序遍历: ``` void inorderTraversal(TreeNode* root) { if (root == NULL) { return; } inorderTraversal(root->left); // 递归遍历左子树 printf("%d ", root->val); // 访问根节点 inorderTraversal(root->right); // 递归遍历右子树 } ``` 后序遍历: ``` void postorderTraversal(TreeNode* root) { if (root == NULL) { return; } postorderTraversal(root->left); // 递归遍历左子树 postorderTraversal(root->right); // 递归遍历右子树 printf("%d ", root->val); // 访问根节点 } ``` 2. 二叉树非递归遍历 前序遍历: ``` void preorderTraversal(TreeNode* root) { if (root == NULL) { return; } stack<TreeNode*> st; st.push(root); while (!st.empty()) { TreeNode* node = st.top(); st.pop(); printf("%d ", node->val); // 访问节点 if (node->right != NULL) { st.push(node->right); // 右子节点先入栈,保证左子节点先出栈 } if (node->left != NULL) { st.push(node->left); } } } ``` 中序遍历: ``` void inorderTraversal(TreeNode* root) { stack<TreeNode*> st; TreeNode* node = root; while (!st.empty() || node != NULL) { if (node != NULL) { // 当前节点不为空,继续将其左子节点入栈 st.push(node); node = node->left; } else { // 当前节点为空,说明已经到达最左侧,开始出栈访问节点 node = st.top(); st.pop(); printf("%d ", node->val); // 访问节点 node = node->right; // 开始访问右子节点 } } } ``` 后序遍历: ``` void postorderTraversal(TreeNode* root) { if (root == NULL) { return; } stack<TreeNode*> st1, st2; st1.push(root); while (!st1.empty()) { TreeNode* node = st1.top(); st1.pop(); st2.push(node); // 先将当前节点入栈st2 if (node->left != NULL) { st1.push(node->left); // 左子节点入栈st1 } if (node->right != NULL) { st1.push(node->right); // 右子节点入栈st1 } } while (!st2.empty()) { // 出栈访问节点 TreeNode* node = st2.top(); st2.pop(); printf("%d ", node->val); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值