求满二叉树两个节点之间的最短距离

文章介绍了如何在给定的满二叉树中,通过`FindPath`和`QuickFindPath`方法找到两个节点之间的最短路径,包括示例代码实现和路径打印功能。

求满二叉树两个节点之间的最短距离

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FirstSolver
{
   
   
    internal class Program
    {
   
   
        static void Main(string[] args)
        {
   
   
            BinaryTreeNode<int> root1 = FullBinaryTree.CreateTree(1, 4);
            Console.WriteLine(FullBinaryTree.PrintTree(root1));
            Console.WriteLine();

            BinaryTreeNode<int> root2 = FullBinaryTree.CreateTree(101, 4);
            Console.WriteLine(FullBinaryTree.PrintTree(root2));
            Console.WriteLine();

            BinaryTreeNode<int> root3 = FullBinaryTree.CreateTree(201, 4);
            Console.WriteLine(FullBinaryTree.PrintTree(root3));
            Console.WriteLine();

            root1.ParentNode = root2;
            root2.ParentNode = root3;
            root3.ParentNode = root1;

            BinaryTreeNode<int> nodeA = FullBinaryTree.FindNode(root1, 5);
            BinaryTreeNode<int> nodeB = FullBinaryTree.FindNode(root1, 7);
            Console.WriteLine($"[A({
     
     nodeA.Value})]->[B({
     
     nodeB.Value})]");
            Stack<BinaryTreeNode<int>> path = FullBinaryTree.FindPath(nodeA, nodeB);
            Console.WriteLine(FullBinaryTree.PrintPath(path));
            Console.WriteLine(FullBinaryTree.PrintPath(FullBinaryTree.QuickFindPath(nodeA, nodeB)));
            Console.WriteLine();

            nodeB = FullBinaryTree.FindNode(root2, 107);
            Console.WriteLine($"[A({
     
     nodeA.Value})]->[B({
     
     nodeB.Value})]");
            path = FullBinaryTree.FindPath(nodeA, nodeB);
            Console.WriteLine(FullBinaryTree.PrintPath(path));
            Console.WriteLine(FullBinaryTree.PrintPath(FullBinaryTree.QuickFindPath(nodeA, nodeB)));
            Console.WriteLine();

            nodeB = FullBinaryTree.FindNode(root3, 207);
            Console.WriteLine($"[A({
     
     nodeA.Value})]->[B({
     
     nodeB.Value})]");
            path = FullBinaryTree.FindPath(nodeA, nodeB);
            Console.WriteLine(FullBinaryTree.PrintPath(path));
            Console.WriteLine(FullBinaryTree.PrintPath(FullBinaryTree.QuickFindPath(nodeA, nodeB))
在Java中,计算二叉树中两个节点之间最短路径通常涉及到图论的概念,特别是如果将二叉树视为一棵有向无环图(DAG)。一种常见的方法是使用广度优先搜索(Breadth First Search, BFS)或者层次遍历。以下是一个简单的步骤: 1. 将二叉树转换为邻接表或边集表示形式,这样可以方便地存储每个节点与其直接子节点的关系。 2. 使用BFS从起点开始,记录下每层的所有节点,直到找到目标节点或完成一层但仍未找到目标。这是因为BFS总是先访问离起始点近的节点。 3. 每次遍历时,检查当前层是否有目标节点,如果有,则返回已走过的距离加上剩余的层数作为最短路径长度;如果没有,继续向下一层查找。 4. 如果在整个树中都没有找到目标节点,说明它们在不同分支上,此时最短路径就是不存在的,返回null或特殊值。 以下是伪代码示例: ```java List<Node> queue = new ArrayList<>(); queue.add(root); shortestPathLength = Integer.MAX_VALUE; while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { Node current = queue.poll(); if (current.equals(target)) { shortestPathLength = Math.min(shortestPathLength, current.distance); // distance 可能需要预先维护 break; } // 添加当前节点的子节点到队列 for (Node child : current.children) { queue.add(child); } } } if (shortestPathLength == Integer.MAX_VALUE) { return null; // 或者返回特殊值表示找不到路径 } else { return shortestPathLength; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值