生活随笔
收集整理的這篇文章主要介紹了
常考数据结构与算法:判断二叉树是否对称(迭代法,递归法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
給定一棵二叉樹,判斷琪是否是自身的鏡像(即:是否對稱)
例如:下面這棵二叉樹是對稱的
? ? ?1
? ? /? \
? 2? ? 2
?/ \? ? / \
3 4? 4? 3
下面這棵二叉樹不對稱。
? ? 1
? ? / \
? 2? ?2
? ? \? ? \
? ? 3? ? 3
?
思路:要判斷一顆二叉樹是否對稱,要判斷一下幾點,可以用遞歸來實現:
- 判斷一顆二叉樹是不是對稱的,等價于判斷其左右子樹是不是鏡像對稱的
- 判斷鏡對稱像即判斷對稱的位置上的元素是不是相等
- 兩個節點A和B對稱等價于:?
- 這兩個節點上存儲的值相等
- 節點A的左子樹節點和節點B的右子樹上的節點是對稱的
- 節點A的右子樹節點和節點A的左子樹上的節點是對稱的
import java.util.LinkedList;
import java.util.Queue;public class TestTreeSymmertic {public static void main(String[] args) {TreeNode root = new TreeNode(1);TreeNode rleft = new TreeNode(2);TreeNode rleftleft = new TreeNode(3);TreeNode rleftright = new TreeNode(4);TreeNode rright = new TreeNode(2);TreeNode rrightleft = new TreeNode(4);TreeNode rrightright = new TreeNode(3);root.left = rleft;root.right = rright;rleft.left = rleftleft;rleft.right = rleftright;rright.left = rrightleft;rright.right = rrightright;TestTreeSymmertic t = new TestTreeSymmertic();System.out.println(t.isSymmetricIter(root));}/** 迭代方式* 使用隊列, 這是把遞歸程序改寫成迭代程序的常用方法,常常利用while循環while(!queue.isEmpty()){// 判斷邏輯}return true;*/public boolean isSymmetricIter(TreeNode root) {if(null == root){return true;}Queue<TreeNode> treeNodeQueue = new LinkedList<TreeNode>();treeNodeQueue.offer(root.left);treeNodeQueue.offer(root.right);while(!treeNodeQueue.isEmpty()){TreeNode node1 = treeNodeQueue.poll();TreeNode node2 = treeNodeQueue.poll();if(node1 == null && node2 == null){continue;}if(node1 == null || node2 == null || node1.val != node2.val){return false;}treeNodeQueue.offer(node1.left);treeNodeQueue.offer(node2.right);treeNodeQueue.offer(node1.right);treeNodeQueue.offer(node2.left);}return true;}/*** 遞歸的方式* @param root TreeNode類* @return bool布爾型*/public boolean isSymmetric (TreeNode root) {// write code hereif(null == root ) {return true;}return isTreeSymmertic(root.left, root.right);}boolean isTreeSymmertic(TreeNode pHead1,TreeNode pHead2){// 如果左右節點都為空,表示對稱if(pHead1== null && pHead2==null){return true;}// 其中一個節點為空,不對稱if(pHead1==null){return false;}// 其中一個節點為空,不對稱if(pHead2==null){return false;}//1.判斷當前值左右是否相等,2.判斷左子樹的左節點和右子樹的右節點,3.判斷左子樹的右節點和右子樹的左節點是否相等,三者缺一不可,一直遞歸return (pHead1.val==pHead2.val && isTreeSymmertic(pHead1.left,pHead2.right) && isTreeSymmertic(pHead1.right,pHead2.left));}}
?
?
總結
以上是生活随笔為你收集整理的常考数据结构与算法:判断二叉树是否对称(迭代法,递归法)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。