二叉树展开为单链表
二叉树展开为单链表
https://www.nowcoder.com/practice/421a1099535149c0828ad7a6e1ce7b40?tpId=196&tqId=40396&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj&difficulty=undefined&judgeStatus=undefined&tags=580&title=
二叉树展开为单链表
思路:
1.先进行计数一下二叉树的节点的个数(递归)
2.开一个用于存树的节点的容器数组
3.将二叉树的节点存入数组容器中
4.再将二叉树的展开为单链表
代码:
import java.util.*;
import java.util.ArrayList;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
//定义一个变量number用于记录树的节点的个数
public int number=0;
//定义一个函数用于计数树中的节点个数
//只要根节点不为空,就进行计数加一
//进行递归计数,先计数左树的节点的个数,递归计数右树的节点的个数
public void Countnodes(TreeNode root){
if(root!=null){
number++;
}else{
return;
}
Countnodes(root.left);
Countnodes(root.right);
}
//传入需要展开的树的根节点和容器
//doexpandtree()函数,就是将二叉树中的节点存入到数组中
public void doexpandtree(TreeNode root,ArrayList<TreeNode> treenodelist){
//如果树为空,就不需要进行展开
if(root!=null){
treenodelist.add(root);
}else{
return;
}
//否则如果根的左子树不为空,就进行展开
//如果根的右子树不为空,就进行展开
if(root.left!=null){
doexpandtree(root.left,treenodelist);
}
if(root.right!=null){
doexpandtree(root.right,treenodelist);
}
}
public void expandTree (TreeNode root) {
//判断一下如果树为空,就直接不需要进行展开为二叉树
if(root==null){
return;
}
//先计数一下该树的节点的个数
Countnodes(root);
//创建一个用于存树节点的数组链表,因为需要将二叉树展开为单链表的形式存在数组链表中
//所以需要知道该树有多少个节点
ArrayList <TreeNode> treenodelist=new ArrayList<>(number);
//将二叉树展开为单链表
doexpandtree(root,treenodelist);
//将二叉树展开为单链表,将根节点的左指针指向null
TreeNode cur=root;
cur.left=null;
//之后就将每个节点的左指针指向null,将每个节点的右指针指向下一个节点
for(int i=1;i<treenodelist.size();i++){
cur.right=treenodelist.get(i);
cur.right.left=null;
cur=cur.right;
}
}
}