日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

调整搜索二叉树中两个错误的节点

發布時間:2025/4/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 调整搜索二叉树中两个错误的节点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一棵二叉樹原本是搜索二叉樹,但是其中有兩個節點調換了位置,使得這棵二叉樹不再是搜索二叉樹,請找到這兩個錯誤節點并返回。已知二叉樹中所有節點的 值都不一樣,給定二叉樹的頭節點 head,返回一個長度為 2 的二叉樹節點類型 的數組 errs,errs[0]表示一個錯誤節點,errs[1]表示另一個錯誤節點。


如果在原問題中得到了這兩個錯誤節點,我們當然可以通過交換兩個節點的節點 值的方式讓整棵二叉樹重新成為搜索二叉樹。但現在要求你不能這么做,而是在 結構上完全交換兩個節點的位置,請實現調整的函數。

public static class Node{public int value;public Node left;public Node right;public Node(int data){this.value = data;} }public static Node[] getTwoErrNodes(Node head){Node[] errs = new Node[2];if(head == null){return errs;}Stack<Node> stack = new Stack<Node>();Node pre = null;while(!stack.isEmpty() || head != null){if(head != null){stack.push(head);head = head.left;}else{head = stack.pop();if(pre != null && pre.value > head.value){errs[0] = errs[0] == null ? pre : errs[0];errs[1] = head;}pre = head;head = haed.right;}}return errs; }public static Node[] getTwoErrParents(Node head, Node e1, Node e2){Node[] parents = new Node[2];if(head == null){return parents;}Stack<Node> stack = new Stack<Node>();while(!stack.isEmpty() || head != null){if(head != null){stack.push(head);head = head.left;}else{head = stack.pop();if(head.left == e1 || head.right == e1){parents[0] = head;}if(head.left == e2 || head.right == e2){parents[1] = head;}head = head.right;}}return parents; }public static Node recoverTree(Node head){Node[] errs = getTwoErrNodes(head);Node[] parents = getTwoErrParents(head, err[0], err[1]);Node e1 = errs[0];Node e1P = parents[0];Node e1L = e1.left;Node e1R = e1.right;Node e2 = errs[1];Node e2P = parents[1];Node e2L = e2.left;Node e2R = e2.right;if(e1 == head){if(e1 == e2P){e1.left = e2L;e1.right = e2R;e2.right = e1;e2.left = e1L;}else if(e2P.left == e2){e2P.left = e1;e2.left = e1L;e2.right = e1R;e1.left = e2L;e1.right = e2R;}else{e2P.right = e1;e2.left = e1L;e2.right = e1R;e1.left = e2L;e1.right = e2R;}head = e2;}else if(e2 == head){if(e2 == e1P){e2.left = e1L;e2.right = e1R;e1.left = e2;e1.right = e2R;}else if(e1P.left = e1){e1P.left = e2;e1.left = e2L;e1.right = e2R;e2.left = e1L;e2.right = e1R;}else{e1P.right = e2;e1.left = e2L;e1.right = e2R;e2.left = e1L;e2.right = e1R;}head = e1;}else{if(e1 == e2P){if(e1P.left == e1){e1P.left = e2;e1.left = e2L;e1.right = e2R;e2.left = e1L;e2.right = e1;}else{e1P.right = e2;e1.left = e2L;e1.right = e2R;e2.left = e1L;e2.right = e1;}}else if(e2 == e1P){if(e2P.left == e2){e2P.left = e1;e2.left = e1L;e2.right = e1R;e1.left = e2;e1.right = e2R;}else{e2P.right = e1;e2.left = e1L;e2.right = e1R;e1.left = e2;e1.right = e2R;}}else{if(e1P.left == e1){if(e2P.left == e2){e1.left = e2L;e1.right = e2R;e2.left = e1L;e2.right = e1R;e1P.left = e2;e2P.left = e1;}else{e1.left = e2L;e1.right = e2R;e2.left = e1L;e2.right = e1R:e1P.left = e2;e2P.right = e1;}}else{if(e2P.left == e2){e1.left = e2L;e1.right = e2R;e2.left = e1L;e2.right = e1R;e1P.right = e2;e2P.left = e1;}else{e1.left = e2L;e1.right = e2R;e2.left = e1L;e2.right = e1R;e1P.right = e2;e2P.right = e1;}}}}return head; }public static void printTree(Node head){System.out.println("Binary Tree:");printInOrder(head, 0, "H", 17);System.out.println(); }

總結

以上是生活随笔為你收集整理的调整搜索二叉树中两个错误的节点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。