前言
感觉今天题目好难,竟然还是简单题,使用中序遍历
题目
源码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
List<Integer> ans= new ArrayList<Integer>();
int base,max,count;
public int[] findMode(TreeNode root) {
// 方法1使用dfs中序,空间O(n)
// dfs(root);
// 方法2 Morris 中序遍历 空间O(1)
TreeNode cur=root,pre=null;
while(cur!=null){
if(cur.left==null){
update(cur.val);
cur=cur.right;
continue;
}
pre=cur.left;
while(pre.right!=null && pre.right!=cur){
pre=pre.right;
}
if(pre.right==null){
pre.right=cur;
cur=cur.left;
}else{
pre.right=null;
update(cur.val);
cur=cur.right;
}
}
int []res=new int[ans.size()];
for(int i =0;i<ans.size();++i){
res[i]=ans.get(i);
}
return res;
}
// // public void dfs(TreeNode node){
// // if(node ==null){
// // return;
// // }
// // bfs(node.left);
// // update(node.val);
// // bfs(node.right);
// // }
public void update(int x){
if (x==base){
count++;
}else{
count=1;
base=x;
}
if(count==max){
ans.add(base);
}
if(count>max){
max=count;
ans.clear();
ans.add(base);
}
}
}