メインコンテンツへスキップ
  1. 記事/

LeetCode.二分木

·123 文字·1 分·
Hassenfeld
著者
Hassenfeld
Viva La Vida
LeetCode - この記事は連載の一部です
パート 2: この記事

二分木は、以下を含みます:

  1. ノード要素;
  2. 子ノードを指すポインタ Left
  3. もう一方の子ノードを指すポインタ Right

LeetCodeにおける木の表現方法:

struct TreeNode {
	int val;
	TreeNode *left;
	TreeNode *right;
	TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

leetcode104. 二分木の最大深さ
#

int maxDepth(TreeNode* root) {
	if(root==nullptr){
		return 0;
	}
	return max(maxDepth(root->left),maxDepth(root->right))+1;
}
  • 最初は左右の子木の深さを再帰的に計算します #再帰
  • max() は最大深さ +1 を返します

leetcode226. 二分木の反転
#

TreeNode* invertTree(TreeNode* root) {
	if(root==nullptr){
		return nullptr;
	}
	TreeNode* temp;
	temp=root->left;
	root->left=root->right;
	root->right=temp;
	invertTree(root->left);
	invertTree(root->right);
	return root;
}

二分木を再帰的にトラバースし、各ノードの左右の子ノードを入れ替えることで、二分木の鏡像(ミラー)を生成することを検討します。

  • 時間計算量:O(n)
  • 空間計算量:O(n)

leetcode101. 対称な二分木
#

bool isSymmetric(TreeNode* root) {
	if(root==nullptr){
		return true;
	}
	return isMirror(root->left,root->right);
}
bool isMirror(TreeNode* root1,TreeNode* root2){
	if(root1==nullptr&&root2==nullptr){
		return true;
	}
	if(root1==nullptr||root2==nullptr||root1->val!=root2->val){
		return false;
	}
	return(isMirror(root1->left,root2->right)&&isMirror(root1->right,root2->left));
 }
  • 時間計算量:O(n)
  • 空間計算量:O(n)

関数 isSymmetric() :

  • 特殊ケースの処理:根ノード root が空の場合は、直接 true を返します。
  • 戻り値:isMirror(root->left, root->right) の結果。

関数 isMirror()

  • まず、現在の左右の2つのノードが対称条件を満たしているか判断します。
  • 次に、これら2つのノードの子ノードである L.leftR.right が対称か、また L.rightR.left が対称かを判断します。 #再帰 ![[対称二分木.png|697]]

LeetCode - この記事は連載の一部です
パート 2: この記事