package main import . "nc_tools" /* * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param proot TreeNode类 * @param k int整型 * @return int整型 */ func KthNode( proot *TreeNode , k int ) int { // write code here lenTree := 0 getSize(proot, &lenTree) if proot == nil || k > lenTree || k <= 0{ return -1 } res := 0 inOrder(proot, &k, &res) return res } func inOrder(proot *TreeNode, k *int, res *int) { // 分析知本题应使用中序遍历解题 if proot == nil { // 1.如果当前节点为空,则直接返回 return } if proot.Left != nil { // 2.否则,若当前节点的左节点存在,中序遍历左节点(即一直遍历到整棵树的最左边) inOrder(proot.Left, k, res) } (*k)-- // 3.到此对k减1,表明访问到了第一小的元素 if *k == 0 { // 4.判断k是否为0,若是,说明当前节点即为第k小的元素,将值赋给res,并直接返回 *res = proot.Val return } if proot.Right != nil { // 5.若k不为0,说明当前节点不是第k小的元素,中序遍历右节点 inOrder(proot.Right, k, res) } } func getSize(proot *TreeNode, lenTree *int) { // 遍历所有元素来统计该树的节点个数,用于与k比较 if proot != nil { *lenTree++ getSize(proot.Left, lenTree) getSize(proot.Right, lenTree) } }