day15 -- バイナリー ツリー

二分探索木と二重リンクリスト

 

バイナリ ツリー上で非再帰的な順序トラバーサル を実行し、トラバース中にノード間のポインタを調整して、二重リンク リストにします。

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
#include <stack>
class Solution {
public:
    TreeNode* Convert(TreeNode* pRootOfTree) {
        if(!pRootOfTree) return pRootOfTree;
		TreeNode *p=pRootOfTree, *pre=NULL;
		stack<TreeNode*> s;
		bool isf=true;
		while(p || !s.empty()){
			while(p){
				s.push(p);
				p=p->left;
			}
			p=s.top(); s.pop(); //最左的叶子结点先出栈
			if(isf){ //双链表的第一个节点
				pRootOfTree=p;
				pre=pRootOfTree;
				isf=false;
			}else{
				pre->right=p;
				p->left=pre;
				pre=p;
			}
			p=p->right;//第一次之后,p=NULL,因此会执行出栈6...
		}
		return pRootOfTree;
    }
};

バイナリツリーをマージする

class Solution {
public:
    /**
     * 
     * @param t1 TreeNode类 
     * @param t2 TreeNode类 
     * @return TreeNode类
     */
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        if(!t1) return t2;
        if(!t2) return t1;
        TreeNode* newh=new TreeNode(t1->val+t2->val);//根相加
        newh->left=mergeTrees(t1->left, t2->left);//对应左边合并
        newh->right=mergeTrees(t1->right, t2->right);//对应右边合并
        return newh;
    }
};

 二分木の鏡像

左と右の子を再帰的に入れ替えます

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param pRoot TreeNode类 
     * @return TreeNode类
     */
    TreeNode* Mirror(TreeNode* pRoot) {
        if(!pRoot) return pRoot;
        TreeNode* tmp=pRoot->left;
        pRoot->left=pRoot->right;
        pRoot->right=tmp;
        Mirror(pRoot->left);
        Mirror(pRoot->right);
        return pRoot;
    }
};

 二分探索木かどうかの判定

 

二分探索木かどうかの判定方法:

  1. 二分木を順番に走査すると、二分探索木である増加シーケンスが得られます。なぜなら、二分木を順番に走査して得られるシーケンスは、二分木内のノードの値を小さいものから大きいものまで並べた結果であるからです。

  2. 各ノードについて、左側のサブツリーのすべてのノードはその値より小さい値を持ち、右側のサブツリーのすべてのノードはその値より大きい値を持ちます。各ノードがこの条件を満たすかどうかを再帰的に判断します。

再帰的判断

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param root TreeNode类 
     * @return bool布尔型
     */
    bool isValidBST(TreeNode* root) {
        return isValidBST(root, nullptr, nullptr);
    }
    bool isValidBST(TreeNode* r, TreeNode* min, TreeNode* max){
        if(!r) return true;
        if((min && r->val<=min->val) || (max && r->val>=max->val)) return false;//不满足左边<r 或 右边>r  ===>  false
        //递归检查左右子树
        return (isValidBST(r->left, min, r) && isValidBST(r->right, r, max));
    }
};

 

 

 

おすすめ

転載: blog.csdn.net/qq_54809548/article/details/131100119