1.質問分析
バイナリツリーが対称かどうかを判断する関数を実装してください。バイナリツリーがこのバイナリツリーのミラーイメージと同じである場合は、対称として定義することに注意してください。
二分木が対称であるかどうかを判断すること、主に二分木の左のサブツリーと右のサブツリーが対称であるかどうかを判断すること。
(1)二分木のルートノードが空の場合、
(2)二分木の左サブツリーの左ノードと右サブツリーの右ノード、左サブツリーの右ノードと右サブツリーの左ノードが等しいかどうかを再帰的に判定する。
2、再帰的なコード
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val)
{
this.val =val;
}
}
public class Test_15 {
boolean isSymmetrical(TreeNode pRoot) {
//二叉树为空
if (pRoot == null) {
return true;
}
return isSymmetrical(pRoot.left, pRoot.right);
}
private boolean isSymmetrical(TreeNode left, TreeNode right) {
//左右节点均为空
if (left == null && right == null) {
return true;
}
//左右节点有一个为空
if (left == null || right == null) {
return false;
}
//递归判断
return left.val == right.val
&& isSymmetrical(left.left, right.right)
&& isSymmetrical(left.right, right.left);
}
}
3.非再帰的コード:DFS深度優先トラバーサル
DFSはスタックを使用してノードのペアを保存します
(1)スタックからポップアウトするときは、ペアである必要があります。
(2)両方が空の場合は続行します
(3)空の場合は直接falseを返し、それ以外の場合は空ではありません。現在の値が等しいかどうかを比較します。
(4)各スタックはペアにする必要があります。左のサブツリーの左のノードと右のサブツリーの右のノード、左のサブツリーの右のノードと右のサブツリーの左のノード、
boolean isSymmetricalDFS(TreeNode pRoot)
{
if(pRoot == null) return true;
Stack<TreeNode> s = new Stack<>();
s.push(pRoot.left);
s.push(pRoot.right);
while(!s.empty()) {
TreeNode right = s.pop();//成对取出
TreeNode left = s.pop();
if(left == null && right == null) continue;
if(left == null || right == null) return false;
if(left.val != right.val) return false;
//成对插入
s.push(left.left);
s.push(right.right);
s.push(left.right);
s.push(right.left);
}
return true;
}
4番目の非再帰コード:BFS幅優先トラバーサル
BFSはキューを使用してノードのペアを保存します
(1)ペアで出発する
(2)すべてが空で、判断を続け、一方のパーティが空でfalseを返す
(3)同様に、チームに入るたびに、ペアにする必要があります。左のサブツリーの左のノードと右のサブツリーの右のノード;左;サブツリーの右ノードと右サブツリーの左ノード。
boolean isSymmetricalBFS(TreeNode pRoot)
{
if(pRoot == null) return true;
Queue<TreeNode> s = new LinkedList<>();
s.offer(pRoot.left);
s.offer(pRoot.right);
while(!s.isEmpty()) {
TreeNode left= s.poll();//成对取出
TreeNode right= s.poll();
if(left == null && right == null) continue;
if(left == null || right == null) return false;
if(left.val != right.val) return false;
//成对插入
s.offer(left.left);
s.offer(right.right);
s.offer(left.right);
s.offer(right.left);
}
return true;
}