基于二叉树的习题

关于二叉数的基本考题:
1.给出一个二叉搜索树,在不创建节点的情况下变成双节点的有序链表。
首先思考这个问题在不构建其他链表的情况下,应该是在已有的二叉搜索树上直接进行更改。我们通过分析二叉树得知每个节点刚好有三个域值与双向链表的data、next、prev相互对应。解决了双向链表的问题接下来我们思考该如何遍历才能把二叉树变为有序的(根据二叉搜索树的原理可知,二叉搜索树的根节点大于左树,小于右树,我们可以采用中序便利得到从小到大排列的有序数列。)
这些问题解决完了开始写代码:
public Node convertBst(Node root){
if(root == null){
return null
}
convertChild(root);
Node head = root;
while(head.left != null){
head = head.left
}
return head;
}
public Node prev = null;

public void convertChild(Node pCur){
if(pCur == null){
return ;
}
convertChild(pCur.left);
pCur.left = prev;
if(pCur!= null){
prev.right = pCur;
}
prve = pCur;
convertChild(pCur.right);

}
2 还有一个问题也是关于二叉搜索树
就是把小的数加上所有比他大的数之后返回,例如左树是2,根节点是5,右树是13,返回的就是左树是20,根节点是18,右子树就是13不变我们有两种方法来解决一种是利用递归的方法,一种是利用非递归的方法。今天我们分别来详细说明这两个方法:
public int prev = 0;
public Node constractBst(Node root){
if(root == null){
return null;
}
Node node = root;
while(node!= null || !stack.isEmpty()){
while(node != null){
stack.add(node);
node = node.right;
}
node = stack.pop();
node.val += prev;
prev = node.val;
if(node.left != null){
node = node.left;
}else{
node = null;
}
}
return root;
}
接下来是递归的方法:
public int prev = 0;
public Node constractBfs1(Node root){
if(root ==null){
return null;}
Node node = root;
constractBfs(node.right);
node.val += prev;
prev = node.val;
constractBfs(node.left);
return root;
}
关于二叉树的计算层数问题,首先先算出左子树的高度,再算出右子树的高度,让两个子树的高度相比哪个大就是整个树的高度
利用递归思想,首先考虑问题的结束条件是什么,当这个树遍历完了递归也就结束了,每一次递归返回时给上层的值是什么?很显然我们要计算出这一层的树的高度。
这一层主要干些什么。思考完成后开始写代码。

public Node Depth(Node root){
if(root == null){
return null;
}
return Math.max(Depth(root.left),Depth(root.right))+1;
}
4判断一棵树是不是完全二叉树,利用队列,首先按照层序遍历的方法把每一层都放到队列当中,然后按照每层队列的个数开始让队列顶端的数字出队,接着加入该出队数字的左右孩子,一次进行上述方法,知道队列全部便利完成,判断队列中是否还有值不是null的数字,有的话直接返回该树不是完全二叉树,否则返回是。

public Node isTree(Node root){
if(root ==null){
return true;}
Queue queue = new ArrayList<>();
if(root != null){
queue.add(root);}
int size= queue.size();
while(!queue.isEmpty()){
for(int i=0;i<size;i++){
Noder node = queue.pop();
if(node.left != null){
queue.add(node.left);
}
if(node.right != null){
queue.add(node.right);
}
}
while(!queue.isEmpty()){
Node node1 = queue.peek();

if(node1 != null){
return false;
}else{
queue.pop();
}
retutrn true;
}
}
接下来我们来看看在什么情况下会返回两个数值相同
public class TestDemo {
public static void main(String[] args) {
int i=0;
Integer j = new Integer(0);
System.out.println(ij);//基本类型的数据与引用类型的数据进行比较时引用类型的数据会自动拆箱变成基本类型的数据此时比较的就是两个基本类型
System.out.println(j.equals(i));//用equals进行比较时基本类型的数据会进行装箱操作此时由于Integer重写了equals方法所以返回的是true
//如果是两个基本类型的数值在比较如果这两个基本类型的值均在-128到127之间则相同否则不相同返回false
//如果是两个引用类型的数值即使值相同在
的时候返回的地址也不相同,但是在比较equals的时候要看看这个引用类型是否重写了equals方法,如果重写了则判断相同否则查看equals源码可知equals任然比较的是两个值的地址,肯定此时返回false
}
}
我的错题集合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值