Golang程序 计算树中叶子节点数量

Golang程序 计算树中叶子节点数量

在Go编程语言中,树是一种数据结构,其中每个节点都有一个值,零到多个节点为子节点。根节点是没有父节点的节点,而叶节点是没有子节点的节点。树可以被用于各种任务,包括数据存储、排序和分层结构的搜索。我们将使用两种方法来计算树中叶节点的数量。在第一种方法中使用了TreeNode结构,而在第二个例子中则使用队列来执行程序。

方法1:使用TreeNode结构

该方法实现了count_leaf_nodes函数,该函数以根节点为参数,并返回树中叶节点的数量。它还使用TreeNode结构构建了一个树数据结构。count_leaf_nodes函数被main函数调用,以计算已经挂起的样本树的叶节点。该程序将产生4个作为其输出。

算法

  • 第1步– 创建一个包main,并在程序中声明fmt(格式包)和strings包,其中main产生可执行代码,fmt帮助格式化输入和输出。

  • 第2步– 创建一个名为TreeNode的结构,它有节点值的字段和指向其左右子节点的指针,以代表树中的一个节点。

  • 第3步– 创建一个名为count_leaf_nodes的函数,以TreeNode指针为参数,返回树中叶子节点的数量。

  • 第4步 – 在count_leaf_nodes函数中验证根节点是否为nil。如果是则返回0,因为没有叶子节点。

  • 第5步– 如果根节点不是nil,则检查左和右的子节点是否为nil。如果是,返回1,因为这个节点是一个叶子节点。

  • 第6步– 如果左和右的子节点不是空的,就递归调用countLeafNodes,然后返回两个结果的总和。

  • 第7步– 在主函数中创建一个TreeNode结构实例来表示树的根节点,并将其左右子节点设置为其他TreeNode结构实例来表示树的其他部分。

  • 第8步– 在调用count_leaf_nodes方法时使用根节点作为参数。树中叶子节点的数量将是该函数的输出。

例子

在这个例子中,我们将使用TreeNode结构来实现树中叶子节点的数量。

package main
import "fmt"

type TreeNode struct { //create a TreeNode struct whose values are to be counted 
   Val       int
   Left_val  *TreeNode
   Right_val *TreeNode
}

func count_leaf_nodes(root *TreeNode) int {
   if root == nil {
      return 0
   }
   if root.Left_val == nil && root.Right_val == nil {
      return 1
   }
   return count_leaf_nodes(root.Left_val) + count_leaf_nodes(root.Right_val)
}

func main() {
   root := &TreeNode{Val: 10,
      Left_val: &TreeNode{Val: 20,   //assign values to the list
         Left_val: &TreeNode{Val: 40,
            Left_val:  nil,
            Right_val: nil,
         },
         Right_val: &TreeNode{Val: 50,
            Left_val:  nil,
            Right_val: nil,
         },
      },
      Right_val: &TreeNode{Val: 30,
         Left_val: &TreeNode{Val: 60,
            Left_val:  nil,
            Right_val: nil,
         },
         Right_val: &TreeNode{Val: 70,
            Left_val:  nil,
            Right_val: nil,
         },
      },
   }
   fmt.Println("The total no. of leaf nodes in the tree are:")
   fmt.Println(count_leaf_nodes(root)) // output:4
}

输出

The total no. of leaf nodes in the tree are:
4

方法2:使用队列来计算树中叶子节点的数量

这种方法使用一个队列来跟踪下一个要访问的节点。当向队列中添加节点时,它从添加根节点开始。然后,它重复地从前面取下下一个节点,确定它是否是一个叶子节点(也就是说,如果它的左边和右边的子节点是空的),如果它的子节点不是空的,就把它们加到队列的后面。一个count变量,每次遇到叶子节点时都会增加,用来跟踪叶子节点的数量。在访问完每个节点后,该函数返回计数。

算法

  • 第1步– 创建一个包main,并在程序中声明fmt(格式包)和strings包,其中main产生可执行代码,fmt帮助格式化输入和输出。

  • 第2步– 创建一个名为TreeNode的结构,它有节点值的字段和指向其左右子节点的指针,以代表树中的一个节点。

  • 第3步– 创建一个名为count_leaf_nodes的函数,以TreeNode指针为参数,返回树中叶子节点的数量。

  • 第4步 – 创建一个队列,并将其根节点和计数设置为0。

  • 第5步–

a. 当队列中仍然包含节点时,从队列中删除初始节点。

b. 如果被删除的节点是一个叶子节点(也就是说,如果它的左边和右边的子节点是空的),则增加计数。

c. 如果被排队的节点的左边子节点不是空的,就排队。

d. 如果去排队节点的右边子节点不是空的,就排队。

  • 第6步 – 将计数返回给函数。

  • 第7步– 在主函数中创建一个TreeNode结构实例来表示树的根节点,并将其左右子节点设置为其他TreeNode结构实例来表示树的其他部分。

例子

在这个例子中,我们将使用队列数据结构来实现该程序。

package main
import "fmt"

type TreeNode struct { //create a TreeNode struct whose leaf nodes are to be counted
   Val       int
   Left_val  *TreeNode
   Right_val *TreeNode
}

func count_leaf_nodes(root *TreeNode) int {
   if root == nil {
      return 0
   }
   queue := []*TreeNode{root}  //use a queue to count no. of leaf nodes
   count := 0
   for len(queue) > 0 {
      node := queue[0]
      queue = queue[1:]
      if node.Left_val == nil && node.Right_val == nil {
         count++
      }
      if node.Left_val != nil {
         queue = append(queue, node.Left_val)
      }
      if node.Right_val != nil {
         queue = append(queue, node.Right_val)
      }
   }
   return count
}

func main() {
   root := &TreeNode{Val: 1,
      Left_val: &TreeNode{Val: 2,
         Left_val: &TreeNode{Val: 4, //assign the values to the list
            Left_val:  nil,
            Right_val: nil,
         },
         Right_val: &TreeNode{Val: 5,
            Left_val:  nil,
            Right_val: nil,
         },
      },
      Right_val: &TreeNode{Val: 3,
         Left_val: &TreeNode{Val: 6,
            Left_val:  nil,
            Right_val: nil,
         },
         Right_val: &TreeNode{Val: 7,
            Left_val:  nil,
            Right_val: nil,
         },
      },
   }
   fmt.Println("The no. of leaf nodes in the tree are:")
   fmt.Println(count_leaf_nodes(root)) //output:4
}

输出

The no. of leaf nodes in the tree are:
4

总结

我们用两个例子执行了计算树中叶子节点数量的程序。在第一个例子中,我们使用TreeNode结构的树数据结构,在第二个例子中,我们使用队列数据结构来执行程序。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程