劍指offer面試題63:二叉搜尋樹的第k個節點 Java實現
阿新 • • 發佈:2019-02-02
/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 號:v1.0 * 題目描述:二叉搜尋樹的第k個節點 * 給定一顆二叉搜尋樹,請找出其中的第k大的節點。例如,下圖中的二叉搜尋樹中,按節點數值大小順序第三個節點的值 是4. * 輸入描述:無 * 程式輸出:第3大的節點是: * 4 * 問題分析: 無 * 演算法描述:如果按照中序遍歷的順序遍歷一棵二叉搜尋樹,遍歷序列的數值是遞增排序的。 * 上圖中的二叉搜尋樹的中序遍歷序列為{2,3,4,5,6,7,8},因此,只需要用中序遍歷演算法遍歷一棵二叉搜尋樹,就很容易找出它的第k大結點。 * 完成日期:2016-10-17 ***************************************************************/ package org.marsguo.offerproject63; class TreeNode{ int val; public TreeNode left = null; public TreeNode right = null; public TreeNode(int val){ this.val = val; } public String toString(){ return val + ""; } } class SolutionMethod1{ public TreeNode inorderTraversal(TreeNode root,int k){ if(root == null || k == 0){ return null; } int[] temp = {k}; return inorderTraversalCore(root,temp); } public TreeNode inorderTraversalCore(TreeNode root,int[] k){ TreeNode target = null; if(root.left != null ) target = inorderTraversalCore(root.left,k); if(target == null){ if(k[0] == 1) target = root; k[0]--; } if(target == null && root.right != null) target = inorderTraversalCore(root.right, k); return target; } } public class KthNode { public static void main(String[] args){ SolutionMethod1 solution1 = new SolutionMethod1(); TreeNode n1 = new TreeNode(5); TreeNode n2 = new TreeNode(3); TreeNode n3 = new TreeNode(7); TreeNode n4 = new TreeNode(2); TreeNode n5 = new TreeNode(4); TreeNode n6 = new TreeNode(6); TreeNode n7 = new TreeNode(8); // TreeNode n8 = new TreeNode(8); // TreeNode n9 = new TreeNode(9); n1.left = n2; n1.right = n3; n2.left = n4; n2.right = n5; n3.left = n6; n3.right = n7; // n4.left = n8; // n4.right = n9; System.out.println("第" + 3 + "大的節點是:"); System.out.println(solution1.inorderTraversal(n1, 3)); } }
程式執行結果: