标签:public stack eal 返回 treenode tree 存在 avl 使用
LinkedBinaryTree
类的contains
方法。AVLTreeNode
,换句话说,AVL树和二叉查找树以及链表实现的二叉树之间的关系。首先,根据书上P240所述
由于需要上溯树,因此AVL树通常最好实现为每个结点都包含一个指向其父结点的引用。
其次,根据书上P239所述
对于树中的每个结点,我们都会跟踪其左、右子树的高度。
int
型变量height
,来得出结点的高度。AVLTreeNode
和LinkedAVLTree
的平衡方法后,我需要实现添加和删除方法。但是,AVL树和二叉查找树唯一不同的是添加和删除中如果不平衡要进行旋转。 所以,AVL树是可以继承二叉查找树的。AVLTreeNode
因此肯定也要继承二叉树指针类BinaryTreeNode
。但是,其实根本不用这么麻烦呀!BinaryTreeNode
构建新的构造方法不就可以了!public BinaryTreeNode(T obj, LinkedBinaryTree<T> left, LinkedBinaryTree<T> right,int height)`
存在的问题:
虽然准确理解了AVL树中旋转平衡的操作,但是并没有整体理解代码与代码之间的关系。花费大量的时间做了无用功,同时让自己陷入了错误的循环。
如果,我直接发现AVL树是二叉查找树的子类,那我也不会构建新的指针类。
所以,解决代码问题,首先需要宏观的观察,确定好整体的架构,这便是UML类图的重要性。不然,尽管你细节处理的再完美,方向错了,便是越走越远。
先设计,考虑所有的情况,再去实现。
根据书P238 给出右旋的操作
- 使树根的左孩子元素成为新的根元素。
- 使原根元素成为这个新树根的右孩子元素。
- 使原树根的左孩子的右孩子,成为原树根的新的左孩子。
node
是原树根,node1
是新树根。node1 = node.left;
node1.right = node;
node.left = node1.right;
node.height = Math.max(height(node.left),height(node.right));
node1.height = Math.max(height(node1.left),height(node1.right));
return node1;
StackOverflowError
错误。...
上周无错题,优秀!
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 10/10 | |
第二周 | 610/610 | 1/2 | 20/30 | |
第三周 | 593/1230 | 1/3 | 18/48 | |
第四周 | 2011/3241 | 2/5 | 30/78 | |
第五周 | 956/4197 | 1/6 | 22/100 | |
第六周 | 2294/6491 | 2/8 | 20/120 | |
第七周 | 914/7405 | 1/9 | 20/140 |
标签:public stack eal 返回 treenode tree 存在 avl 使用
原文地址:https://www.cnblogs.com/gk0625/p/9899030.html