1. 程式人生 > >Leetcode958. Check Completeness of a Binary Tree二叉樹的完全驗證性

Leetcode958. Check Completeness of a Binary Tree二叉樹的完全驗證性

給定一個二叉樹,確定它是否是一個完全二叉樹。

百度百科中對完全二叉樹的定義如下:

若設二叉樹的深度為 h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。(注:第 h 層可能包含 1~ 2h 個節點。)

 

示例 1:

輸入:[1,2,3,4,5,6] 輸出:true 解釋:最後一層前的每一層都是滿的(即,結點值為 {1} 和 {2,3} 的兩層),且最後一層中的所有結點({4,5,6})都儘可能地向左。

示例 2:

輸入:[1,2,3,4,5,null,7] 輸出:false 解釋:值為 7 的結點沒有儘可能靠向左側。

 

提示:

  1. 樹中將會有 1 到 100 個結點。

 

個人遞迴方法:

class Solution {
	 bool isTheEnd = false;
	 int depth = 0;
 public:
	 bool isCompleteTree(TreeNode* root) 
	 {
		 if (root == NULL)
			 return true;
		 depth = GetDepth(root);
		 return GetAns(root, 1);
	 }

	 int GetDepth(TreeNode *root)
	 {
		 if (root == NULL)
			 return 0;
		 return max(GetDepth(root->left), GetDepth(root->right)) + 1;
	 }

	 bool GetAns(TreeNode *root, int dep)
	 {
//只有根節點的情況,不用判空,因為不會遞迴到那
		 if (dep == depth)
		 {
			 return true;
		 }
		 if (dep < depth - 1)
		 {
			 if (root->left == NULL || root->right == NULL)
				 return false;
			 return GetAns(root->left, dep + 1) && GetAns(root->right, dep + 1);
		 }
		 else if (dep == depth - 1)
		 {
			 if (isTheEnd)
			 {
				 if (root->left != NULL || root->right != NULL)
					 return false;
				 return true;
			 }
			 else
			 {
				 if (root->left == NULL)
				 {
					 if (root->right != NULL)
						 return false;
					 isTheEnd = true;
					 return true;
				 }
				 if (root->right == NULL)
				 {
					 isTheEnd = true;
					 return true;
				 }
				 return true;
			 }
		 }
	 }
 };

 

廣度優先遍歷法(推薦):

bool isCompleteTree(TreeNode* root) {
        queue<TreeNode *> que;
        que.push(root);
        while(!que.empty())
        {
            TreeNode * node = que.front();
            que.pop();
            if(!node)
            {
                break;
            }
            else
            {
                que.push(node->left);
                que.push(node->right);
            }
        }
        while(!que.empty())
        {
            TreeNode * node=que.front();
            if(node)
                return false;
            que.pop();
        }
        return true;
    }