树的深度优先遍历

下面是直接用深度优先搜索,优点是过程更自然,缺点是效率没有宽度优先搜索高  
   
  drop   proc   proc__tree  
  go  
   
  create   proc   proc__tree   (@parent   char(20))  
    as  
  begin  
      set   nocount   on  
      declare   @level   int   ,@i   int   ,@flag   int  
      declare   @stack   table   (parent   char(20),child   char(20),level   int,row   int   ,   flag   int)  
      select   @level   =   1,@i=1,@flag=1  
      insert   @stack   select   parent,child,   @level,0,1   from       new_tree     where   parent   =   @parent   and   child   is   not   null  
       
      while   @level   >   0  
      begin  
          if   exists   (select   *   from   @stack   where   level   =   @level   and   flag=1)  
          begin  
                select   @parent   =   min(child)   from   @stack     where   level   =   @level   and   flag=1  
                update   @stack   set   flag   =0   ,   row=@i   where   level   =   @level   and   child   =   @parent   and     flag   =1  
                select   @i   =   @i   +1  
                insert   @stack   select   parent,child,   @level   +   1,0,1   from       new_tree     where   parent   =   @parent   and   child   is   not   null  
                if   @@rowcount   >   0  
                      select   @level   =   @level   +   1  
          end  
          else  
          begin  
              select   @level   =   @level   -   1  
          end  
      end    
      select   row,parent   ,child,level   from   @stack   order   by   row  
      set   nocount   off  
  end  
  go  
  proc__tree   '1'  
 
 
### 树的深度优先遍历算法实现及原理 #### 原理概述 深度优先遍历(Depth First Search, DFS)是一种用于遍历或搜索树或图的重要方法。其核心思想是从根节点开始,尽可能深地探索每一个分支,直到到达叶子节点或者无法继续前进为止,然后再回溯到上一层节点并重复这一过程[^1]。 DFS 的主要特点是利用栈这种数据结构来保存访问路径中的节点信息。在实际编程中,可以通过显式的栈操作或者隐式的函数调用堆栈来完成遍历任务[^2]。 --- #### 实现方式 以下是基于 Java 编程语言的二叉树深度优先遍历的具体实现: ##### 方法一:递归法 递归是最常见的实现深度优先遍历的方式之一。它通过函数自身的嵌套调用来模拟栈的行为,从而简化了代码逻辑。 ```java // 定义二叉树节点类 class TreeNode { int value; TreeNode left; TreeNode right; public TreeNode(int value) { this.value = value; this.left = null; this.right = null; } } public class BinaryTree { // 使用递归实现前序遍历 (Pre-order Traversal) void preOrder(TreeNode node) { if (node != null) { System.out.print(node.value + " "); // 访问当前节点 preOrder(node.left); // 遍历左子树 preOrder(node.right); // 遍历右子树 } } // 中序遍历 (In-order Traversal) void inOrder(TreeNode node) { if (node != null) { inOrder(node.left); System.out.print(node.value + " "); inOrder(node.right); } } // 后序遍历 (Post-order Traversal) void postOrder(TreeNode node) { if (node != null) { postOrder(node.left); postOrder(node.right); System.out.print(node.value + " "); } } } ``` 上述代码展示了三种不同的遍历顺序: - **前序遍历**:先访问根节点,再依次访问左子树和右子树。 - **中序遍历**:先访问左子树,接着访问根节点,最后访问右子树。 - **后序遍历**:先访问左子树和右子树,最后访问根节点。 --- ##### 方法二:迭代法 如果希望避免递归带来的潜在栈溢出风险,则可以采用显式栈的方式来手动管理节点序列。 ```java import java.util.Stack; public class IterativeTraversal { // 迭代版前序遍历 void iterativePreOrder(TreeNode root) { Stack<TreeNode> stack = new Stack<>(); if (root == null) return; stack.push(root); while (!stack.isEmpty()) { TreeNode current = stack.pop(); System.out.print(current.value + " "); if (current.right != null) { stack.push(current.right); // 右孩子先进栈,后处理 } if (current.left != null) { stack.push(current.left); // 左孩子后进栈,先处理 } } } } ``` 此版本使用 `Stack` 数据结构替代了递归过程中使用的系统调用栈,适用于大规模数据集下的场景。 --- #### 应用实例 除了基本的树形结构外,深度优先遍历还可以扩展至更复杂的领域,比如求解组合优化问题——0-1 背包问题。在这种情况下,每个决策点对应于是否选取某件商品作为解决方案的一部分,形成了一棵完整的二叉树模型[^3]。 例如,在给定容量 C 和 n 种不同重量 w[i] 的物品时,我们构建一棵高度为 n 层的满二叉树表示所有可能的选择状态,并运用剪枝技术减少不必要的计算量以提高效率。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值