使用递归的方法求解:
首先如果根节点为空,返回是对称的,
如果根节点不为空,则判断左子数和右子树是不是镜像对称的,判断方法是先判断左子数和右子树根节点是否相同,再判断左子数的左孩子和右子树的右孩子;左子数的右孩子和右子树的左孩子是否对称;
据此写出递归的伪代码:
函数a(左子树,右子树,返回是否对称) 判断判断左子数和右子树根节点是否相同以及a(左子数的左孩子和右子树的右孩子) a(左子数的右孩子和右子树的左孩子) 只有都返回为真值才能认为对称。
迭代求解思路:
引入队列是将递归改为迭代的常用方法,将根节点两次加入队列,然后将左子数根节点右子树根节点加入队列,然后按照顺序将左子树的左节点和右子树的右节点,左子树的右节点和右子树的左节点加入队列,两两判断队列元素是否相等。直到发现不相等元素或者队列为空返回。
注:因为这道题没有规定一定要过根节点,所以要遍历所有的节点,找到以这个节点为根节点的最长直径。这些路径的最大值就是这颗树的最长路径。
以当前节点为根节点的最长路径长度等于其左孩子为根的子树深度+右孩子为根的子树深度。
据此写出伪代码:
定义一个全局变量最大值 ans=0;
def 函数1()
{
if(root==null){ return 0;}
else{ dfs(root); return max}
}
def dfs(node){
if(node==null){ return 0;}
else{
L=dfs(node.left) //获得左子树高度
R=dfs(node.right)//获得右子树高度
ans=Math.max(ans,L+R);
return Math.max(L,R);//返回当前结点为根的高度
}
}
}