{"id":231,"date":"2013-06-18T21:38:40","date_gmt":"2013-06-18T13:38:40","guid":{"rendered":"http:\/\/coderbee.net\/?p=231"},"modified":"2014-11-28T20:32:24","modified_gmt":"2014-11-28T12:32:24","slug":"%e9%9d%9e%e9%80%92%e5%bd%92%e3%80%81%e5%9b%ba%e5%ae%9a%e9%87%8f%e9%a2%9d%e5%a4%96%e5%ad%98%e5%82%a8%e7%a9%ba%e9%97%b4-%e9%81%8d%e5%8e%86%e4%ba%8c%e5%8f%89%e6%a0%91","status":"publish","type":"post","link":"https:\/\/coderbee.net\/index.php\/algorithm\/20130618\/231","title":{"rendered":"\u975e\u9012\u5f52\u3001\u56fa\u5b9a\u91cf\u989d\u5916\u5b58\u50a8\u7a7a\u95f4 \u904d\u5386\u4e8c\u53c9\u6811"},"content":{"rendered":"<h2>\u975e\u9012\u5f52\u3001\u56fa\u5b9a\u91cf\u989d\u5916\u5b58\u50a8\u7a7a\u95f4 \u904d\u5386\u4e8c\u53c9\u6811<\/h2>\n<h3>\u9898<\/h3>\n<p>\u5199\u51fa\u4e00\u4e2aO(n)\u65f6\u95f4\u7684\u975e\u9012\u5f52\u8fc7\u7a0b\uff0c\u8f93\u51fa\u7ed9\u5b9a\u7684\u542bn\u4e2a\u8282\u70b9\u7684\u4e8c\u53c9\u6811\u4e2d\u6bcf\u4e2a\u7ed3\u70b9\u7684\u5173\u952e\u5b57\uff0c\u8981\u6c42\u53ea\u80fd\u4f7f\u7528\u9664\u6811\u672c\u8eab\u4ee5\u5916\u56fa\u5b9a\u91cf\u7684\u989d\u5916\u5b58\u50a8\u7a7a\u95f4\uff0c\u800c\u4e14\u5728\u8fc7\u7a0b\u4e2d\u4e0d\u80fd\u4fee\u6539\u8be5\u6811\uff0c\u54ea\u6015\u53ea\u662f\u6682\u65f6\u7684\u3002<\/p>\n<h3>\u6811\u7684\u904d\u5386\u65b9\u5f0f\u5206\u7c7b<\/h3>\n<h4>\u4ece\u6811\u7684\u6df1\u5ea6\u5206\u7c7b<\/h4>\n<p>\u6811\u7684\u904d\u5386\u53ef\u4ee5\u5206\u4e3a\u5e7f\u5ea6\u4f18\u5148\u548c\u6df1\u5ea6\u4f18\u5148\u4e24\u79cd\u5f62\u5f0f\u3002<\/p>\n<ul>\n<li>\u5e7f\u5ea6\u4f18\u5148\uff0c\u5c31\u662f\u5148\u8f93\u51fa\u7236\u7ed3\u70b9\uff0c\u518d\u8f93\u51fa\u5b50\u7ed3\u70b9\u3002\u4e00\u822c\u501f\u52a9\u4e8e\uff08FIFO\uff09\u961f\u5217\u3002<\/li>\n<li>\u6df1\u5ea6\u4f18\u5148\uff0c\u5c31\u662f\u5148\u8f93\u51fa\u5b50\u7ed3\u70b9\uff0c\u518d\u8f93\u51fa\u7236\u7ed3\u70b9\u3002\u4e00\u822c\u9700\u8981\u501f\u52a9\uff08LIFO\uff09\u6808\u7ed3\u6784\uff0c\u5982\u679c\u4e0d\u4f7f\u7528\u6808\u6570\u636e\u7ed3\u6784\uff0c\u4e00\u822c\u5c31\u9700\u8981\u501f\u7528\u8fd0\u884c\u65f6\u7684\u65b9\u6cd5\u8c03\u7528\u6808\u3002<\/li>\n<\/ul>\n<h4>\u4ece\u6811\u7684\u8282\u70b9\u7684\u5148\u540e\u987a\u5e8f\u5206\u7c7b<\/h4>\n<p>\u6811\u7684\u904d\u5386\u53ef\u4ee5\u5206\u4e3a\u5148\u6839\u904d\u5386\u3001\u4e2d\u5e8f\u904d\u5386\u3001\u540e\u5e8f\u904d\u5386\u3002\u524d\u4e2d\u540e\u662f\u4ee5\u7236\u8282\u70b9\u5728\u904d\u5386\u4e2d\u7684\u987a\u5e8f\u4e3a\u6839\u636e\u7684\u3002<\/p>\n<ul>\n<li>\u5148\u6839\u904d\u5386\uff1a\u5148\u904d\u5386\u6839\uff0c\u518d\u904d\u5386\u5de6\u5b50\u6811\uff0c\u6700\u540e\u904d\u5386\u53f3\u5b50\u6811\u3002<\/li>\n<li>\u4e2d\u5e8f\u904d\u5386\uff1a\u5148\u904d\u5386\u5de6\u5b50\u6811\uff0c\u518d\u904d\u5386\u6839\uff0c\u6700\u540e\u904d\u5386\u53f3\u5b50\u6811\u3002<\/li>\n<li>\u540e\u5e8f\u904d\u5386\uff1a\u5148\u904d\u5386\u5de6\u5b50\u6811\uff0c\u518d\u904d\u5386\u53f3\u5b50\u6811\uff0c\u6700\u540e\u904d\u5386\u6839\u3002<\/li>\n<\/ul>\n<h3>\u5206\u6790<\/h3>\n<p>\u7531\u4e8e\u53ea\u80fd\u4f7f\u7528\u56fa\u5b9a\u91cf\u7684\u989d\u5916\u5b58\u50a8\u7a7a\u95f4\uff0c\u6240\u4ee5\uff0c\u6ca1\u6cd5\u6784\u5efa\u961f\u5217\u6216\u6808\u6765\u8fdb\u884c\u904d\u5386 \u6216 \u7528\u53d8\u91cf\u6807\u8bb0\u54ea\u4e9b\u7ed3\u70b9\u662f\u5df2\u8f93\u51fa\u7684\u3002\u7531\u4e8e\u4e0d\u80fd\u4fee\u6539\u6811\uff0c\u4e5f\u6ca1\u6cd5\u5728\u6811\u4e0a\u505a\u6807\u8bb0\u3002\u6240\u4ee5\uff0c\u7ed3\u70b9\u662f\u5426\u5df2\u8f93\u51fa\u53ea\u80fd\u5728\u904d\u5386\u8fc7\u7a0b\u4e2d\u5224\u65ad\uff0c\u4e5f\u5c31\u9700\u8981\u904d\u5386\u7684\u7b97\u6cd5\u80fd\u591f\u533a\u5206\u51fa\u5df2\u8f93\u51fa\u548c\u672a\u8f93\u51fa\u7684\u3002<\/p>\n<p>\u5982\u679c\u91c7\u7528\u5e7f\u5ea6\u4f18\u5148\u7684\u65b9\u5f0f\uff0c\u5148\u8f93\u51fa\u7236\u7ed3\u70b9\u540e\uff0c\u7531\u4e8e\u6ca1\u6709\u8db3\u591f\u7684\u7a7a\u95f4\u6765\u5b58\u50a8\u5bf9\u5b50\u6811\u7684\u5f15\u7528\uff0c\u6811\u53ef\u4ee5\u8bf4\u662f\u53d8\u4e3a\u4e24\u68f5\u72ec\u7acb\u7684\u6811\uff0c\u8fd9\u4e2a\u65b9\u5f0f\u5e94\u8be5\u662f\u4e0d\u53ef\u884c\u7684\u3002<\/p>\n<p>\u5982\u679c\u91c7\u7528\u6df1\u5ea6\u4f18\u5148\u7684\u65b9\u5f0f\uff0c\u4ee5\u4e2d\u5e8f\u904d\u5386\u4e3a\u4f8b\uff0c\u603b\u662f\u6309\u5de6\u5b50\u6811\u3001\u7236\u7ed3\u70b9\u3001\u53f3\u5b50\u6811\u7684\u987a\u5e8f\u904d\u5386\uff0c\u90a3\u4e48\u5f53\u53f3\u5b50\u6811\u904d\u5386\u5b8c\u540e\uff0c\u8bf4\u660e\u7236\u7ed3\u70b9\u53ca\u5176\u6240\u6709\u5b50\u6811\u90fd\u904d\u5386\u5b8c\u6210\u4e86\uff0c\u53ef\u4ee5\u8fd9\u6837\u5f80\u4e0a\u5904\u7406\u7236\u7ed3\u70b9\u7684\u7236\u7ed3\u70b9\u3002<strong>\u800c\u5224\u65ad\u53f3\u5b50\u6811\u662f\u5426\u904d\u5386\u5b8c\u6210\u53ef\u4ee5\u901a\u8fc7\uff1a\u5f53\u524d\u904d\u5386\u5b8c\u6210\u7684\u7ed3\u70b9\u662f\u5426\u662f\u7236\u7ed3\u70b9\u7684\u53f3\u7ed3\u70b9\u6765\u5b8c\u6210<\/strong>\u3002\u8fd9\u79cd\u65b9\u6cd5\u662f\u53ef\u884c\u7684\u3002<\/p>\n<p>\u5f53\u7ed3\u70b9p\u53ca\u5176\u5b50\u6811\u90fd\u904d\u5386\u5b8c\u6210\u540e\uff0c\u9700\u8981\u5411\u4e0a\u67e5\u627e\u7b2c\u4e00\u4e2a\u672a\u904d\u5386\u7684\u53f3\u5b50\u6811\uff08<code>parent = p.parent<\/code>\uff09\uff1a<\/p>\n<ul>\n<li><code>p == parent.rChild<\/code>\uff0c\u5f53\u524d\u904d\u5386\u662f\u5b50\u6811\u662f\u53f3\u5b50\u6811\uff0c\u9700\u8981\u7ee7\u7eed\u5f80\u4e0a\u67e5\u627e\uff1b<\/li>\n<li>\u5426\u5219\uff0cp\u662fparent\u7684\u5de6\u5b69\u5b50\uff0c\u5148\u8f93\u51faparent\uff1b\u5982\u679cparent\u6709\u53f3\u5b69\u5b50\uff0c\u9700\u8981\u8fdb\u884c\u904d\u5386\uff1b\u5982\u679cparent\u6ca1\u6709\u53f3\u5b69\u5b50\uff0c\u9700\u8981\u7ee7\u7eed\u5f80\u4e0a\u67e5\u627e\u3002<\/li>\n<\/ul>\n<p><!--more--><\/p>\n<h3>\u5b9e\u73b0<\/h3>\n<pre class=\"brush: java; gutter: true; first-line: 1\">class Node {\r\n     Node parent;\r\n     Node lChild;\r\n     Node rChild;\r\n     int key;\r\n\r\n     public Node(int key) {\r\n          this.key = key;\r\n     }\r\n}\r\n\r\npublic class BinaryTree {\r\n\r\n     public static Node build(int[] keys) {\r\n          Node root = null;\r\n\r\n          for (int key : keys) {\r\n               Node node = new Node(key);\r\n               if (root == null) {\r\n                    root = node;\r\n               } else {\r\n                    insertNode(root, node);\r\n               }\r\n          }\r\n\r\n          return root;\r\n     }\r\n\r\n     public static void insertNode(Node parent, Node node) {\r\n          if (node.key &lt; parent.key) {\r\n               if (parent.lChild == null) {\r\n                    parent.lChild = node;\r\n                    node.parent = parent;\r\n               } else {\r\n                    insertNode(parent.lChild, node);\r\n               }\r\n          } else {\r\n               if (parent.rChild == null) {\r\n                    parent.rChild = node;\r\n                    node.parent = parent;\r\n               } else {\r\n                    insertNode(parent.rChild, node);\r\n               }\r\n          }\r\n     }\r\n\r\n     public static List&lt;Integer&gt; midOrderIterate(Node root) {\r\n          List&lt;Integer&gt; list = new LinkedList&lt;Integer&gt;();\r\n          if (root == null) {\r\n               return list;\r\n          }\r\n          Node p = root;\r\n          Node parent = null;\r\n\r\n          outer: while (true) {\r\n               if (p.lChild != null) {\r\n                    p = p.lChild;     \/\/ \u5148\u5904\u7406\u5de6\u5b50\u6811\u3002\r\n               } else if (p.rChild != null) {     \/\/ \u6ca1\u6709\u5de6\u5b50\u6811\uff0c\u4f46\u6709\u53f3\u5b50\u6811\uff0c\u5148\u5904\u7406\u4e86\u81ea\u8eab\u8282\u70b9\uff0c\u518d\u5904\u7406\u53f3\u5b50\u6811\r\n                    list.add(p.key);\r\n                    p = p.rChild;\r\n               } else {\r\n                    list.add(p.key);     \/\/ \u53f6\u5b50\u8282\u70b9\r\n\r\n                    while (true) {     \/\/ \u5904\u7406\u53f6\u5b50\u8282\u70b9\u540e\u9700\u8981\u5f80\u4e0a\u67e5\u627e\uff0c\u67e5\u627e\u7b2c\u4e00\u4e2a\u53f3\u7ed3\u70b9\u672a\u5904\u7406\u7684\u7ed3\u70b9\u3002\r\n                         parent = p.parent;\r\n                         if (parent == null) { \/\/ \u6839\u7ed3\u70b9\r\n                              break outer;\r\n                         }\r\n                        \r\n                         if (parent.rChild == p) { \/\/ \u5f53\u524d\u7ed3\u70b9\u662f\u7236\u7ed3\u70b9\u7684\u53f3\u7ed3\u70b9\uff0c\u8bf4\u660e\u7236\u7ed3\u70b9\u53ca\u4ee5\u4e0b\u7684\u6574\u68f5\u5b50\u6811\u5df2\u5904\u7406\uff0c\u7ee7\u7eed\u5f80\u4e0a\u67e5\u627e\u3002\r\n                              p = parent;\r\n                         } else {\r\n                              \/\/ \u5f53\u524d\u7ed3\u70b9\u662f\u7236\u7ed3\u70b9\u7684\u5de6\u7ed3\u70b9\r\n                              list.add(parent.key);     \/\/ \u5148\u5904\u7406\u4e86\u7236\u7ed3\u70b9\r\n                             \r\n                              if(parent.rChild != null) { \/\/ parent\u6709\u53f3\u5b69\u5b50\uff0c\u5219parent.rChild\u80af\u5b9a\u662f\u672a\u904d\u5386\u7684\u3002\r\n                                   p = parent.rChild;\r\n                                   break;\r\n                              } else {     \/\/ \u7236\u7ed3\u70b9\u6ca1\u6709\u53f3\u5b50\u6811\uff0c\u8bf4\u660e\u7236\u7ed3\u70b9\u53ca\u4ee5\u4e0b\u7684\u6574\u68f5\u5b50\u6811\u5df2\u5904\u7406\uff0c\u7ee7\u7eed\u5f80\u4e0a\u67e5\u627e\u3002\r\n                                   p = parent;\r\n                              }\r\n                         }\r\n                    }\r\n               }\r\n          }\r\n          return list;\r\n     }\r\n\r\n     public static void main(String[] args) {\r\n          int[][] keys = new int[][] { new int[] { 4 },\r\n                    new int[] { 4, 5, 6, 7, 8, 9, },\r\n                    new int[] { 8, 7, 6, 5, 4, 3 },\r\n                    new int[] { 8, 4, 9, 2, 5, 10, 1, 3, 6, 7 },\r\n                    new int[] { 8, 4, 13, 2, 5, 12, 14, 1, 3, 6, 11, 10, 9 },\r\n                    new int[] { 8, 7, 15, 12, 17, 16 }, };\r\n\r\n          for (int[] key : keys) {\r\n               Node root = BinaryTree.build(key);\r\n               Arrays.sort(key);\r\n              \r\n               array = testMidOrderIterate(root);\r\n               eq = isEq(array, key);\r\n               System.out.println(\"testMidOrderIterate()  isOk: \" + eq);\r\n          }\r\n     }\r\n    \r\n     public static Integer[] testMidOrderIterate(Node root) {\r\n          List&lt;Integer&gt; list = BinaryTree.midOrderIterate(root);\r\n          return list.toArray(new Integer[] {});\r\n     }\r\n    \r\n     public static Integer[] testIterate(Node root) {\r\n          List&lt;Integer&gt; list = BinaryTree.iterate(root);\r\n          Collections.sort(list);\r\n          return list.toArray(new Integer[] {});\r\n     }\r\n    \r\n     public static boolean isEq(Integer[] array, int[] key) {\r\n          if (array.length == key.length) {\r\n               for (int i = 0; i &lt; array.length; i++) {\r\n                    if (array[i].intValue() != key[i]) {\r\n                         return false;\r\n                    }\r\n               }\r\n          } else {\r\n               return false;\r\n          }\r\n\r\n          return true;\r\n     }\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<hr\/>\n<p>\u6b22\u8fce\u5173\u6ce8\u6211\u7684\u5fae\u4fe1\u516c\u4f17\u53f7: <strong>coderbee\u7b14\u8bb0<\/strong>\uff0c\u53ef\u4ee5\u66f4\u53ca\u65f6\u56de\u590d\u4f60\u7684\u8ba8\u8bba\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"258\" height=\"258\" src=\"https:\/\/coderbee.net\/wp-content\/uploads\/2019\/01\/coderbee-note.jpg\" class=\"alignnone size-full wp-image-1707\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u975e\u9012\u5f52\u3001\u56fa\u5b9a\u91cf\u989d\u5916\u5b58\u50a8\u7a7a\u95f4 \u904d\u5386\u4e8c\u53c9\u6811 \u9898 \u5199\u51fa\u4e00\u4e2aO(n)\u65f6\u95f4\u7684\u975e\u9012\u5f52\u8fc7\u7a0b\uff0c\u8f93 &hellip; <a href=\"https:\/\/coderbee.net\/index.php\/algorithm\/20130618\/231\">\u7ee7\u7eed\u9605\u8bfb <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[53],"tags":[55,56,58],"_links":{"self":[{"href":"https:\/\/coderbee.net\/index.php\/wp-json\/wp\/v2\/posts\/231"}],"collection":[{"href":"https:\/\/coderbee.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/coderbee.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/coderbee.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/coderbee.net\/index.php\/wp-json\/wp\/v2\/comments?post=231"}],"version-history":[{"count":12,"href":"https:\/\/coderbee.net\/index.php\/wp-json\/wp\/v2\/posts\/231\/revisions"}],"predecessor-version":[{"id":1106,"href":"https:\/\/coderbee.net\/index.php\/wp-json\/wp\/v2\/posts\/231\/revisions\/1106"}],"wp:attachment":[{"href":"https:\/\/coderbee.net\/index.php\/wp-json\/wp\/v2\/media?parent=231"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coderbee.net\/index.php\/wp-json\/wp\/v2\/categories?post=231"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coderbee.net\/index.php\/wp-json\/wp\/v2\/tags?post=231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}