首页 > 其他分享 >二叉树

二叉树

时间:2023-09-19 20:04:10浏览次数:25  
标签:Node cur BSTreeNode 插入 二叉树 key

二叉树

搜索二叉树:左边比根小,右边比根大;子树也满足这个特征。

搜索二叉树还有一个特征:去走一个中序是一个升序的状态。所以搜索二叉树可以叫做二叉排序树或二叉查找树。

模板不喜欢用T了,因为喜欢用K(关键字)。

推荐一般用BinarySearchTree,二叉搜索树,不要用SearchTreeBinary,因为简写出来是SBTree。

template<class K>
struct BSTreeNode {
	BSTreeNode<K>* _left;	
	BSTreeNode<K>* _right;
	K _key;
};


template<class K>
class BSTree {
	//喜欢在类里进行类型重定义,因为受到类域的限制
	typedef BSTreeNode<K> Node;
public:
	bool Insert(const K& key)
	{
	}
private:
	Node* _root = nullptr; //构造函数懒得给了,直接写一个缺省值
};

我们先进行一个插入:

image-20230422100907573

插入有成功也有失败:

当我们想进行插入12和13时,可以和各个树的根结点进行比较,确定插入的位置。默认的搜索二叉树是不允许冗余的,有相同的值会插入失败。

根的值是怎么来的?插入的第一个值就是根。所以如果是同样的值,插入的顺序不同树的形状就不同。

bool Insert(const K& key)
	{
		if (_root == nullptr)//确定是否是插入的第一个值
		{
			_root = new Node(key);
			return true;
		}
		//当根不是空时,找对应的位置
		Node* cur = _root;
		while (cur)//cur不等于空就继续,等于空就结束
		{
			if (cur->_key < key)
			{
				cur = cur->_right;
			}
			else if (cur->_key > key)
			{
				cur = cur - > _left;
			}
			else
			{ 
				return false;
			}
		}
		cur = new Node(key);
		return true;
		 
	}

直接用cur = new Node(key),可不可以?不可以,没有和树链接起来,出了作用域就找不到这个结点了。我们可以通过定义parent找到父节点。

标签:Node,cur,BSTreeNode,插入,二叉树,key
From: https://blog.51cto.com/u_15562309/7528184

相关文章

  • 《剑指Offer》-34-二叉树中和为某一值的路径
    思路要求是从根节点开始的路径,这会比从任意节点开始的路径简单很多思路是从根节点开始遍历每一条路径,如果和没有达到目标值就继续向下遍历大于就回退,等于就返回到结果集中,可以看到这是一个回溯动作实际过程中,首先不管是等于还是大于,回退pop()操作都要执行,这样才不会影响到后......
  • 114. 二叉树展开为链表
    给你二叉树的根结点root,请你将它展开为一个单链表:展开后的单链表应该同样使用TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。展开后的单链表应该与二叉树先序遍历顺序相同。示例1:输入:root=[1,2,5,3,4,null,6]输出:[1,null,2,null,3,null,......
  • 剑指Offer面试题7:重建二叉树
    一、题目给定节点数为n的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。提示:1.vin.length== pre.length2.pre和vin 均无重复元素3.vin出现的元素均出现在 ......
  • 543. 二叉树的直径
    给你一棵二叉树的根节点,返回该树的直径。二叉树的直径是指树中任意两个节点之间最长路径的长度。这条路径可能经过也可能不经过根节点root。两节点之间路径的长度由它们之间边数表示。输入:root=[1,2,3,4,5]输出:3解释:3,取路径[4,2,1,3]或[5,2,1,3]的长度。......
  • 平衡二叉树的平衡机制
    1.什么是平衡二叉树,就是任意节点的左右子树的层数之差不超过1.前提它是一个二叉树。 2.一个平衡二叉树,在以下4种情况下,会破坏平衡(为啥要知道4种基本的情况,因为跟左旋和右旋的息息相关)。 2.1根节点--->左子树--->左子节点。增加节点操作。简称左左。 2.2根节点--->左子树-......
  • leetcode 二叉树的最小深度
    给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例1:输入:root=[3,9,20,null,null,15,7]输出:2示例2:输入:root=[2,null,3,null,4,null,5,null,6]输出:5解题思路如果当前节点为null,返......
  • leetcode 平衡二叉树
    给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。示例1:输入:root=[3,9,20,null,null,15,7]输出:true示例2:输入:root=[1,2,2,3,3,null,null,4,4]输出:false示例3:输入:root......
  • 中序线索化二叉树
    思路:1、线索化二叉树结点定义与二叉树基本相同,只是在原先的基础上添加了int类型的左右线索标志。 2、定义全局变量pre,用来指向当前结点的前驱结点。 3、构造visit()时,如果访问结点的左孩子为空,需要建立前驱线索并将ltag设为1;如果访问结点的前驱结点不为空且其右孩子为空,需要建立......
  • 中序线索化二叉树
    思路:线索化二叉树结点定义与二叉树基本相同,只是在原先的基础上添加了int类型的左右线索标志。定义全局变量pre,用来指向当前结点的前驱结点。构造visit()时,如果访问结点的左孩子为空,需要建立前驱线索并将ltag设为1;如果访问结点的前驱结点不为空且其右孩子为空,需要建立后继线索并......
  • 二叉树的遍历
    总结深度优先与广度优先的区别1、区别1)二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。2)深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。要特别注意的是,二叉树的深度优先遍历比较特殊,可以......