概述:
左耳朵耗子專欄《左耳聽風》 用戶自發每週完成一個ARTS:
1.Algorithm:每週至少做一個 leetcode 的算法題
2.Review:閱讀並點評至少一篇英文技術文章
3.Tip:學習至少一個技術技巧
4.Share:分享一篇有觀點和思考的技術文章
這周刷的這道樹節點旋轉算法題還是有點難度的,關於什麼是樹節點旋轉我結合了下邊的這段代碼來進行展示:
package 算法部分.綜合升級;
import 算法部分.樹.BalanceTreeDemo;
/**
* 給定一個單鏈表,其中的元素按升序排序,請將它轉化成平衡二叉搜索樹(BST)
*
* @author idea
* @data 2019/9/18
*/
public class ListToTree {
TreeNode root;
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public void insert(int val) {
if (this.root == null) {
this.root = new TreeNode(val);
return;
}
TreeNode current = root;
while (true) {
if (val < current.val) {
if (current.left == null) {
current.left = new TreeNode(val);
break;
}
current = current.left;
} else if (val > current.val) {
if (current.right == null) {
current.right = new TreeNode(val);
break;
}
current = current.right;
} else if (current.val == val) {
System.out.println("已經有重複節點了!");
return;
}
}
}
public void readTreeNode(TreeNode treeNode) {
if (treeNode != null) {
System.out.print(treeNode.val + "-->");
} else {
System.out.print("null");
}
}
/**
* 前序遍歷 根+左+右
*/
public void preReadNode(TreeNode node) {
if (node == null) {
return;
}
readTreeNode(node);
preReadNode(node.left);
preReadNode(node.right);
}
public TreeNode sortedListToBST(ListNode head) {
return null;
}
/**
* 左左旋
*
* @param root
* @return
*/
private TreeNode leftLeftRoate(TreeNode root) {
if (root == null) {
return null;
}
TreeNode originRoot = root;
TreeNode newRoot = originRoot.left;
TreeNode newLeftChild = newRoot.right;
originRoot.left = newLeftChild;
newRoot.right = originRoot;
return newRoot;
}
/**
* 左右旋
*
* @param root
* @return
*/
private TreeNode rightRightRoate(TreeNode root){
if(root==null){
return null;
}
TreeNode originRoot=root;
TreeNode newRoot=root.left;
TreeNode temp=newRoot.right;
return null;
}
public static void main(String[] args) {
ListToTree listToTree=new ListToTree();
listToTree.insert(8);
listToTree.insert(4);
listToTree.insert(12);
listToTree.insert(2);
listToTree.insert(3);
listToTree.preReadNode(listToTree.root);
TreeNode newNode = listToTree.leftLeftRoate(listToTree.root);
System.out.println();
listToTree.preReadNode(newNode);
}
}