二叉树综合

二叉搜索树

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:

若它的左子树不为空,则左子树上所有节点的值都小于根节点的值

若它的右子树不为空,则右子树上所有节点的值都大于根节点的值

它的左右子树也分别为二叉搜索树

初步搭建二叉搜索树

二叉搜索树节点

cpp 复制代码
template<class K>
struct BSTreeNode
{
	BSTreeNode(const K& key)
		:_left(nullptr)
		, _right(nullptr)
		, _key(key)
	{}


	BSTreeNode<K>* _left;
	BSTreeNode<K>* _right;

	K _key;
};

二叉树遍历/插入/查找

cpp 复制代码
template<class K>
class BSTree
{
	typedef BSTreeNode<K> Node;
public:
	bool Insert(const K& key)
	{
		if (_root == nullptr)
		{
			_root = new Node(key);
			return true;
		}
		Node* cur = _root;
		Node* parent = nullptr;
		while (cur)
		{
			if (cur->_key < key)
			{
				cur = parent;
				cur = cur->_right;
			}
			else if (cur->_key > key)
			{
				cur = parent;
				cur = cur->_right;
			}
			else return false;
		}
		cur = new Node(key);
		if (parent->_key < key)
			parent->_right = cur;
		else
			parent->_left = cur;
		return true;
	}
	void _InOrder(Node* root)
	{
		if (root == nullptr)
			return;
		_InOrder(root->_left);
		cout << root->_key << "  ";
		_InOrder(root->_right);
	}
	void InOrder()
	{
		_InOrder(_root);
		cout << endl;
	}
	bool Find(const K& key)
	{
		Node* cur = _root;
		while (cur)
		{
			if (cur->_key < key)
				cur = cur->_right;
			else if (cur->_key > key)
				cur = cur->_left;
			else
				return true;
		}
		return false;
	}
private:
	Node* _root=nullptr;
};

删除节点

一共三种情况

cpp 复制代码
bool Erase(const K& key)
{
	Node* parent = nullptr;
	Node* cur = _root;
	while (cur)
	{
		if (cur->_key < key)
		{
			parent = cur;
			cur = cur->_right;
		}
		else if (cur->_key > key)
		{
			parent = cur;
			cur = cur->_left;
		}
		else
		{
			//成功找到节点
			if (cur->_left == nullptr)
			{
				if (cur == root)
				{
					_root = cur->_right;
				}
				else
				{
					if (parent->_right == cur)
						parent->_right = cur->_right;
					else
						parent->_left = cur->_right;
				}
				delete cur;
			}
			else if (cur->_right == nullptr)
			{
				if (cur == root)
				{
					_root = cur->_left;
				}
				else
				{
					if (parent->_left == cur)
						parent->_left = cur->_left;
					else
						parent->_right = cur->_left;
				}
				delete cur;
			}
			else
			{
				Node* rightMinParent = cur;
				Node* rightMin = cur->_right;
				while (rightMin->_left)
				{
					rightMinParent = rightMin;
					rightMin = rightMin->_left;
				}
				cur->_key = rightMin->_key;
				if (rightMin == rightMinParent->_left)
					rightMinParent->_left = rightMin->_right;
				else
					rightMinParent->_right = rightMin->_right;
				delete rightMin;
			}
			return true;
		}
	}
	return false;
}

102. 二叉树的层序遍历

cpp 复制代码
vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> vv;
        queue<TreeNode*> q;
        if (root)
            q.push(root);
        while (!q.empty()) {
...            }
            vv.push_back(v);
        }
        return vv;
    }

107. 二叉树的层序遍历 II

cpp 复制代码
 vector<vector<int>> levelOrderBottom(TreeNode* root) {
         vector<vector<int>> vv;
        queue<TreeNode*> q;
        if(root)
        {
            q.push(root);
        }
        
        while(!q.empty())
        {
//通过控制每一层的数据个数,一个循环一层数据输出
//当第n层出完了,第n+1层都进队列了,q.size()就是n+1层的数据个数,循环在继续处理
            int levelsize=q.size();
            vector<int> v;
            for(int i=0;i<levelsize;++i)
            {
            TreeNode*front=q.front();
            q.pop();
            v.push_back(front->val);
            if(front->left)
                q.push(front->left);
            if(front->right)
                q.push(front->right);
            }
            vv.push_back(v);
        }
        reverse(vv.begin(),vv.end());
        return vv;
    }

236. 二叉树的最近公共祖先

cpp 复制代码
bool Find(TreeNode* root, TreeNode* x)
    {
        if(root==NULL)
            return false;
        return root==x
        ||Find(root->left,x)
        ||Find(root->right,x);
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==NULL)
        return NULL;
        if(root==p||root==q)
        return root;
        bool pInLeft,pInRight,qInleft,qInRight;
        pInLeft=Find(root->left,p);
        pInRight=!pInLeft;
        qInleft=Find(root->left,q);
        qInRight=!qInleft;
        if((pInLeft&&qInRight)||(pInRight&&qInleft))
        {
            return root;
        }
        else if(pInLeft&&qInleft){
            return lowestCommonAncestor(root->left,p,q);
        }
        else
        {
            return lowestCommonAncestor(root->right,p,q);
        }
        return NULL;
    }

将二叉树转为双向链表

cpp 复制代码
void ConvertList(TreeNode* cur,TreeNode*& prev)
	{
		if(cur==nullptr) return;
		ConvertList(cur->left,prev);
		cur->left=prev;
		if(prev) prev->right=cur;
		prev=cur;
		ConvertList(cur->right,prev);

	}
    TreeNode* Convert(TreeNode* pRootOfTree) {
        TreeNode*prev=nullptr;
		ConvertList(pRootOfTree,prev);
		TreeNode* head=pRootOfTree;
		while (head&&head->left) {
			head=head->left;
		}
		return head;
    }
相关推荐
羊小猪~~1 分钟前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
软工菜鸡27 分钟前
预训练语言模型BERT——PaddleNLP中的预训练模型
大数据·人工智能·深度学习·算法·语言模型·自然语言处理·bert
南宫生29 分钟前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
AI视觉网奇1 小时前
sklearn 安装使用笔记
人工智能·算法·sklearn
JingHongB1 小时前
代码随想录算法训练营Day55 | 图论理论基础、深度优先搜索理论基础、卡玛网 98.所有可达路径、797. 所有可能的路径、广度优先搜索理论基础
算法·深度优先·图论
weixin_432702261 小时前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论
小冉在学习1 小时前
day52 图论章节刷题Part04(110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长 )
算法·深度优先·图论
Repeat7151 小时前
图论基础--孤岛系列
算法·深度优先·广度优先·图论基础
小冉在学习1 小时前
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
java·算法·图论
武子康2 小时前
大数据-212 数据挖掘 机器学习理论 - 无监督学习算法 KMeans 基本原理 簇内误差平方和
大数据·人工智能·学习·算法·机器学习·数据挖掘