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

 

  对于一颗二叉树,深度优先搜索(Depth First Search)是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。以上面二叉树为例,深度优先搜索的顺序

为:ABDECFG。怎么实现这个顺序呢 ?深度优先搜索二叉树是先访问根结点,然后遍历左子树接着是遍历右子树,因此我们可以利用堆栈的先进后出的特点,

现将右子树压栈,再将左子树压栈,这样左子树就位于栈顶,可以保证结点的左子树先与右子树被遍历。

  广度优先搜索(Breadth First Search),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,上面二叉树的遍历顺序为:ABCDEFG.

可以利用队列实现广度优先搜索。

  下面给出二叉树dfs和bfs的具体代码:

 1 #include <vector>
 2 #include <iostream>
 3 #include <stack>
 4 #include <queue>
 5 using namespace std;
 6 
 7 struct BitNode
 8 {
 9     int data;
10     BitNode *left, *right;
11     BitNode(int x) :data(x), left(0), right(0){}
12 };
13 
14 void Create(BitNode *&root)
15 {
16     int key;
17     cin >> key;
18     if (key == -1)
19         root = NULL;
20     else
21     {
22         root = new BitNode(key);
23         Create(root->left);
24         Create(root->right);
25     }
26 }
27 
28 void PreOrderTraversal(BitNode *root)
29 {
30     if (root)
31     {
32         cout << root->data << " ";
33         PreOrderTraversal(root->left);
34         PreOrderTraversal(root->right);
35     }
36 }
37 
38 //深度优先搜索
39 //利用栈,现将右子树压栈再将左子树压栈
40 void DepthFirstSearch(BitNode *root)
41 {
42     stack<BitNode*> nodeStack;
43     nodeStack.push(root);
44     while (!nodeStack.empty())
45     {
46         BitNode *node = nodeStack.top();
47         cout << node->data << ' ';
48         nodeStack.pop();
49         if (node->right)
50         {
51             nodeStack.push(node->right);
52         }
53         if (node->left)
54         {
55             nodeStack.push(node->left);
56         }
57     }
58 }
59 
60 //广度优先搜索
61 void BreadthFirstSearch(BitNode *root)
62 {
63     queue<BitNode*> nodeQueue;
64     nodeQueue.push(root);
65     while (!nodeQueue.empty())
66     {
67         BitNode *node = nodeQueue.front();
68         cout << node->data << ' ';
69         nodeQueue.pop();
70         if (node->left)
71         {
72             nodeQueue.push(node->left);
73         }
74         if (node->right)
75         {
76             nodeQueue.push(node->right);
77         }
78     }
79 }
80 
81 int  main()
82 {
83     BitNode *root = NULL;
84     Create(root);
85     //前序遍历
86     PreOrderTraversal(root);
87     //深度优先遍历
88     cout << endl << "dfs" << endl;
89     DepthFirstSearch(root);
90     //广度优先搜索
91     cout << endl << "bfs" << endl;
92     BreadthFirstSearch(root);
93 }

 

转载于:https://www.cnblogs.com/zhangbaochong/p/5492877.html

在 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、付费专栏及课程。

余额充值