深度优先搜索(DFS)

本文详细介绍了深度优先搜索(DFS)算法,包括在图和二叉树中的应用。对于图,DFS需要使用布尔数组避免死循环;而在二叉树的中序遍历中,DFS可能需要结合节点变量来防止无限递归。通过LeetCode94题作为示例,展示了DFS的非递归和递归实现方式。

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

深度优先搜索的算法分为两种,图和二叉树。
普通dfs是应用在图上,要用布尔数组记录所有结点是否访问过,防止无限递归导致死循环。

// java
public class DepthFirstSearch {
    private boolean[] marked;
    private int count;
    public DepthFirstSearch(Graph G, int s) {
		marked = new boolean[G.V()];
		dfs(G, s);
	}
	private void dfs(Graph G, int v) {
		marked[v] = true;
		count++;
		for (int w : G.adj(v))
			if (!marked[w]) dfs(G, w);
	}
	public boolean marked(int w) {
	    return marked[w]; 
	}
	public int count() {
	    return count; 
	}
}

应用在二叉树上时,譬如说中序遍历,因为事前没有记录所有结点的访问记录情况,需要将node变量加入循环,否则会出现死循环。参考题:LeetCode94
非递归:

// c++
node = root;
while (!st.empty() || node) {
    // 每次将node的左孩子结点遍历到底
    while (node) {
        st.push(node);
        node = node->left;
    }
    TreeNode* tmp = st.top();
    res.push_back(tmp->val);
    st.pop();
    node = tmp->right;
}

递归

void getNode(TreeNode* root, vector<int>& vec) {
	if (!root) return;
	getNode(root->left, vec);
	vec.push_back(root->val);
	getNode(root->right, vec);
    return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值