二叉树深度优先遍历和广度优先遍历

二叉树先序、后序、中序遍历非递归版本请参照:


二叉树非递归先序遍历、中序遍历、后序遍历


深度优先遍历:

int bitreeDeepOrder(bitreeNode * root)
{
	stack<bitreeNode *> st;
	st.push(root);
	//printf("%d,", root->value);

	do
	{
		root = st.top();
		st.pop();

		printf("%d,", root->value);

		if(root->right)
			st.push(root->right);

		if(root->left)
			st.push(root->left);

		if(st.empty())
			break;

	}while(1);

	return 0;
}

广度优先遍历:


int bitreeWideOrder(bitreeNode * root)
{
	queue<bitreeNode *> qu;
	qu.push(root);
	//printf("%d,", root->value);

	do
	{
		root = qu.front();
		qu.pop();

		printf("%d,", root->value);

		if(root->left)
			qu.push(root->left);

		if(root->right)
			qu.push(root->right);

		if(qu.empty())
			break;

	}while(1);

	return 0;
}

实验:

#define BITREE_SIZE 10
int _tmain(int argc, _TCHAR* argv[])
{
	bitreeNode * root = (bitreeNode *)malloc(sizeof(bitreeNode) * BITREE_SIZE);
	for(int i=0; i<BITREE_SIZE; i++)
	{
		root[i].value = i;
		if((i * 2 +1) < BITREE_SIZE)
			root[i].left = &(root[i*2+1]);
		else
			root[i].left = NULL;

		if((i * 2 + 2) < BITREE_SIZE)
			root[i].right = &(root[i*2 + 2]);
		else
			root[i].right = NULL;
	}

	bitreeDeepOrder(root);

	printf("\n");

	bitreeWideOrder(root);

	return 0;
}




在 Java 中,可以利用递归或栈结构实现 **二叉树深度优先遍历 (DFS)** 队列实现 **广度优先遍历 (BFS)**。以下是详细的说明: --- ### 深度优先遍历(Depth First Search, DFS) #### 实现方式: 1. 前序遍历(Pre-order Traversal):访问根节点 -> 遍历左子树 -> 遍历右子树。 2. 中序遍历(In-order Traversal):遍历左子树 -> 访问根节点 -> 遍历右子树。 3. 后序遍历(Post-order Traversal):遍历左子树 -> 遍历右子树 -> 访问根节点。 **示例代码 - 递归版本** ```java class TreeNode { int val; TreeNode left, right; public TreeNode(int val) { this.val = val; left = null; right = null; } } public class BinaryTreeTraversal { // 前序遍历 void preOrder(TreeNode root) { if (root == null) return; System.out.print(root.val + " "); preOrder(root.left); preOrder(root.right); } // 中序遍历 void inOrder(TreeNode root) { if (root == null) return; inOrder(root.left); System.out.print(root.val + " "); inOrder(root.right); } // 后序遍历 void postOrder(TreeNode root) { if (root == null) return; postOrder(root.left); postOrder(root.right); System.out.print(root.val + " "); } } ``` --- ### 广度优先遍历(Breadth First Search, BFS) #### 实现方式: 通过借助 `Queue` 数据结构逐层访问节点,先从根开始依次处理每一层的所有节点。 **示例代码** ```java import java.util.LinkedList; import java.util.Queue; public class BreadthFirstSearch { void bfs(TreeNode root) { if (root == null) return; Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()) { TreeNode node = queue.poll(); System.out.print(node.val + " "); if (node.left != null) queue.add(node.left); if (node.right != null) queue.add(node.right); } } } ``` --- ### 总结对比 | 特性 | 深度优先搜索(DFS) | 广度优先搜索(BFS) | |-------------------|---------------------------------------|-------------------------------------| | 使用数据结构 | 栈(系统栈用于递归,手动栈非递归版) | 队列 | | 时间复杂度 | O(n),n为节点数 | O(n) | | 空间复杂度 | 最坏情况O(h), h为树的高度 | 最坏情况O(w), w为最大宽度 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值