树数据结构:
例题1:把二叉搜索树转换为累加树
让我们逆中序遍历一下
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int pre=0;
public TreeNode convertBST(TreeNode root) {
dfs(root);
return root;
}
//这里我们逆中序遍历一下
void dfs(TreeNode root){
if(root==null){
return;
}
dfs(root.right);
root.val+=pre;
pre=root.val;
dfs(root.left);
}
}
例题2:重建二叉树
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
Map<Integer,Integer> map=new HashMap<>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
int n=preorder.length;
for(int i=0;i<n;++i){
map.put(inorder[i],i);
}
return dfs(preorder,inorder,0,n-1,0,n-1);
}
public TreeNode dfs(int[] preorder, int[] inorder,int preorderStart,int preorderEnd,int inorderStart,int inorderEnd){
if(preorderStart>preorderEnd||inorderStart>inorderEnd){
return null;
}
int val=preorder[preorderStart];
TreeNode node =new TreeNode(val);
int index=map.get(val);
node.left=dfs(preorder,inorder,preorderStart+1,preorderStart+index-inorderStart,inorderStart,index-1);
node.right=dfs(preorder,inorder,preorderStart+index-inorderStart+1,preorderEnd,index+1,inorderEnd);
return node;
}
}
例题3:树的子结构
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(A==null||B==null){
return false;
}
return isSame(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B); //先遍历A
}
public boolean isSame(TreeNode A, TreeNode B){
if(B==null){
//把B遍历完,则为有子结构了
return true;
}
if(A==null||A.val!=B.val){
return false;
}
//如果节点值相同,则在同时遍历A的当前节点和B
return isSame(A.left,B.left)&&isSame(A.right,B.right);
}
}
例题4:二叉树的镜像
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode mirrorTree(TreeNode root)