//【1】.**************************************************************************
/**
問題描述:前中後序,遞歸,查找二叉樹最大節點
*/
/**
二叉樹的最大節點
在二叉樹中尋找值最大的節點並返回。
*/
public class TreeNode {
public int value;
public TreeNode leftTreeNode;
public TreeNode rightTreeNode;
public TreeNode(int value, TreeNode leftTreeNode, TreeNode rightTreeNode) {
this.value = value;
this.leftTreeNode = leftTreeNode;
this.rightTreeNode = rightTreeNode;
}
}
private static TreeNode maxTreeNode;
/**
* 考點:二叉樹-深度遍歷-遞歸-前序遍歷
* @param root
* @return
*/
public TreeNode maxNodePre(TreeNode root) {
if (root == null) {
return null;
}
maxTreeNode = root;
nextTreeNodePre(root);
return maxTreeNode;
}
private void nextTreeNodePre(TreeNode treeNode) {
System.out.println(treeNode.value);
if (treeNode.value > maxTreeNode.value) {
maxTreeNode = treeNode;
}
if (treeNode.leftTreeNode != null) {
nextTreeNodePre(treeNode.leftTreeNode);
}
if (treeNode.rightTreeNode != null) {
nextTreeNodePre(treeNode.rightTreeNode);
}
}
/**
* 考點:二叉樹-深度遍歷-遞歸-中序遍歷
* @param root
* @return
*/
public TreeNode maxNodeMid(TreeNode root) {
if (root == null) {
return null;
}
maxTreeNode = root;
nextTreeNodeMid(root);
return maxTreeNode;
}
private void nextTreeNodeMid(TreeNode treeNode) {
if (treeNode.leftTreeNode != null) {
nextTreeNodeMid(treeNode.leftTreeNode);
}
System.out.println(treeNode.value);
if (treeNode.value > maxTreeNode.value) {
maxTreeNode = treeNode;
}
if (treeNode.rightTreeNode != null) {
nextTreeNodeMid(treeNode.rightTreeNode);
}
}
/**
* 考點:二叉樹-深度遍歷-遞歸-後序遍歷
* @param root
* @return
*/
public TreeNode maxNodeAfter(TreeNode root) {
if (root == null) {
return null;
}
maxTreeNode = root;
nextTreeNodeAfter(root);
return maxTreeNode;
}
private void nextTreeNodeAfter(TreeNode treeNode) {
if (treeNode.leftTreeNode != null) {
nextTreeNodeAfter(treeNode.leftTreeNode);
}
if (treeNode.rightTreeNode != null) {
nextTreeNodeAfter(treeNode.rightTreeNode);
}
System.out.println(treeNode.value);
if (treeNode.value > maxTreeNode.value) {
maxTreeNode = treeNode;
}
}
//【2】*************************************************************************************
/**
* 問題描述:進制轉換
給定一個十進制數 n 和 一個整數 k, 將 十進制數 n 轉換成 k進制數.
【方法】:遞歸整除和餘數
* @param n
* @param k
* @return
*/
public String hexConversion(int n, int k) {
StringBuffer resultNumber = new StringBuffer();
tenToK(resultNumber, n, k);
System.out.println("n:k:result: " + n +" "+ k + " " + resultNumber.toString());
return resultNumber.toString();
}
private void tenToK(StringBuffer stringBuffer, int n, int k) {
int integral = n/k;
int mode = n % k;
stringBuffer.insert(0, mode);
if (integral >= k) {
tenToK(stringBuffer, integral, k);
} else if (integral > 0) {
stringBuffer.insert(0, integral);
}
}
private void testHexConversion() {
hexConversion(3, 4);
hexConversion(9, 4);
hexConversion(29, 4);
hexConversion(3, 5);
hexConversion(9, 5);
hexConversion(29, 5);
}
//【3】**************************************************************
/**
位運算實現加法
*/
public int aplusb(int a, int b) {
int sum_without_carry, carry;
sum_without_carry = a^b; //沒有進位的和
carry = (a&b)<<1; //進位
if(carry==0)
return sum_without_carry;
else
return aplusb(sum_without_carry, carry);
}
public void testAplusB() {
int result = aplusb(4,19);
System.out.println(result);
}