二叉链表

笔记-静态二叉链表

荒凉一梦 提交于 2019-11-28 20:08:35
静态二叉链表 不使用指针,而使用数组完成二叉树所有操作 结点左右指针域使用int代替,用来表示左右子树的根结点在数组中的下标 对指针的操作改为对数组下标的访问 struct node{ typename data; int lchild; //指向左子树的指针域 int rchild; //指向右子树的指针域 }Node[maxn]; int index = 0; int newNode(int v){ //分配一个Node数组中的结点给新的结点, index为其下标 Node[index].data = v; Node[index].lchild = -1; Node[index].rchild = -1; //-1和maxn表示空 因为数组范围是 0-maxn return index++; } 查找(root为根结点在数组中的下标) void search(int root, int x, int newdata){ if(root == -1){ return; //空树 死胡同 递归边界 } if(Node[root].data == x){ Node[root].data = newdata; } search(Node[root].lchild, x, newdata); //往左子树递归 search(Node[root].rchild, x, newdata);

二叉搜索树与双向链表

。_饼干妹妹 提交于 2019-11-26 20:07:52
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 方法一:非递归版 //解题思路: //1.核心是中序遍历的非递归算法。 //2.修改当前遍历节点与前一遍历节点的指针指向。 import java.util.Stack; public TreeNode ConvertBSTToBiList(TreeNode root) { if(root==null) return null; Stack<TreeNode> stack = new Stack<TreeNode>(); TreeNode p = root; TreeNode pre = null;// 用于保存中序遍历序列的上一节点 boolean isFirst = true; while(p!=null||!stack.isEmpty()){ while(p!=null){ stack.push(p); p = p.left; } p = stack.pop(); if(isFirst){ root = p;// 将中序遍历序列中的第一个节点记为root pre = root; isFirst = false; }else{ pre.right = p; p.left = pre; pre = p; } p = p.right; } return root; }