数据结构-树
class biTree{ int value; biTree left; biTree right; biTree(int x){value=x;} }
public static biTree reConstruct(int[] preOrder, int[] inOrder){ int length=preOrder.length;//数组元素个数 biTree root=new biTree(preOrder[0]);//根节点初始化为先序数组第一个元素 if(preOrder.length==1){//如果先序遍历长度为1,无子节点 root.left=null; root.right=null; return root; } //找到中序数组根节点值位置 int mark=-1; for(int i=0;i<length;i++){ if(preOrder[0]==inOrder[i]){ mark=i; break; } } if(mark>0){//如果数组中找到根节点 //左子树的先序数组 int[] leftPreOrder=new int[mark]; //左子树的中序数组 int[] leftInOrder=new int[mark]; //记录左子树数组 for(int j=0;j<mark;j++){ leftPreOrder[j]=preOrder[j+1]; } //记录右子树数组 for(int j=0;j<mark;j++){ leftInOrder[j]=inOrder[j]; } //左子树递归 root.left=reConstruct(leftPreOrder,leftInOrder); } else{//如果数组中根节点位置在0,或者没找到根节点 root.left=null;//左子树没有 } if(preOrder.length-1-mark>0){//右子树的长度:总长度-1-根节点位置 //右子树的先序数组 int[] rightPreOrder=new int[preOrder.length-1-mark]; //右子树的中序数组 int[] rightInOrder=new int[preOrder.length-1-mark]; for(int j=mark+1;j<length;j++){ rightInOrder[j-1-mark]=inOrder[j]; rightPreOrder[j-1-mark]=preOrder[j]; } root.right=reConstruct(rightPreOrder,rightInOrder); } else{ root.right=null; } return root; } public static void main(String[] args){ int[] preOrder={1,2,4,7,3,5,6,8}; int[] inOrder={4,7,2,1,5,3,8,6}; reConstruct(preOrder,inOrder); }
public class nextNode { BinaryTreeNode getNext(BinaryTreeNode node){ BinaryTreeNode resNode = null; if(node==null){ return null; } if(node.right!=null){//如果一个节点有右子树,下一个节点就是它的右子树中的最左子节点 resNode=node.right; while(resNode.left!=null){ resNode=resNode.left; } return resNode; } else if(node.right==null){//如果一个节点没有右子树 if(node.parent==null){//如果该节点无父节点:那么没有下一个节点 return null; } else{ //是父节点的左子节点 if(node.parent.left==node){ //那么下一个节点是父节点 resNode=node.parent; } //是父节点的右子节点 else if(node.parent.right==node){ //那么下一个节点需要沿着父节点的指针向上遍历,直到找到一个新节点,原节点存在于这个新节点的左子树中 while(node.parent.right==node){ node=node.parent; } resNode=node.parent; } } } return resNode; } }