大话数据结构-树( 五 )


7.5.6 获得结点的右兄弟
先获得双亲结点 , 然后获得右孩子:
/*** 获得树中结点的右兄弟 , 若无右兄弟则返回空** @param node 指定结点* @return 指定结点的右兄弟* @author Korbin* @date 2023-01-18 18:15:54**/public BinaryTreeNode rightSibling(BinaryTreeNode node) {if (null == node) {return null;}BinaryTreeNode parent = parent(node);if (null == parent) {return null;}BinaryTreeNode rightChild = parent.getRightChild();if (node.equals(rightChild)) {return null;} else {return rightChild;}}
7.5.7 为结点添加子结点
先找到结点 , 再设置即可:
/*** 在树中结点上 , 添加一个非空树为其左子树或右子树** @param node指定结点* @param left是否左子树 , true为左子树 , false为右子树* @param childTree 待添加的树* @author Korbin* @date 2023-01-18 18:16:13**/public void insert(BinaryTreeNode node, boolean left, BinaryTreeNode childTree) {BinaryTreeNode treeNode = findNode(node, root);if (null != treeNode) {if (left) {treeNode.setLeftChild(childTree);} else {treeNode.setRightChild(childTree);}}}
7.5.8 删除结点的子结点
找到结点 , 再设置子结点即可:
/*** 删除树中结点的左子树或右子树** @param node 指定结点* @param left 是否左子树 , true为左子树 , false为右子树* @author Korbin* @date 2023-01-18 18:16:37**/public void delete(BinaryTreeNode node, boolean left) {if (null == node || null == root) {return;}BinaryTreeNode treeNode = findNode(node, root);if (null != treeNode) {if (left) {treeNode.setLeftChild(null);} else {treeNode.setRightChild(null);}}}
7.5.9 前序遍历
若二叉树为空 , 则返回空 , 否则先访问根结点 , 再访问左孩子 , 再访问右孩子 , 遵循根结点->左孩子->右孩子逻辑 , 即从左到右根在前:
/*** 前序遍历** @return 遍历结果* @author Korbin* @date 2023-01-18 18:21:11**/public List preOrderTraverse() {if (null == root) {return null;}return preOrderTraverse(root);}/*** 前缀遍历查找结点** @param rootNode 根结点* @return 前缀遍历结果* @author Korbin* @date 2023-01-19 18:04:46**/public List preOrderTraverse(BinaryTreeNode rootNode) {if (null == rootNode) {return null;}List list = new ArrayList<>();list.add(rootNode);BinaryTreeNode leftChild = rootNode.getLeftChild();if (null != leftChild) {list.addAll(preOrderTraverse(leftChild));}BinaryTreeNode rightChild = rootNode.getRightChild();if (null != rightChild) {list.addAll(preOrderTraverse(rightChild));}return list;}
7.5.10 中序遍历
遍历过程为左孩子->根结点->右孩子 , 即从左到右根在中间:
/*** 中序遍历** @return 遍历结果* @author Korbin* @date 2023-01-18 18:21:11**/public List inOrderTraverse() {if (null == root) {return null;}return inOrderTraverse(root);}/*** 中序遍历** @param rootNode 根结点* @return 遍历结果* @author Korbin* @date 2023-01-18 18:21:11**/public List inOrderTraverse(BinaryTreeNode rootNode) {if (null == rootNode) {return null;}List list = new ArrayList<>();BinaryTreeNode leftChild = rootNode.getLeftChild();if (null != leftChild) {list.addAll(inOrderTraverse(leftChild));}list.add(rootNode);BinaryTreeNode rightChild = rootNode.getRightChild();if (null != rightChild) {list.addAll(inOrderTraverse(rightChild));}return list;}
7.5.11 后序遍历
顺序为左孩子->右孩子->根结点 , 即从左到右根在后:
/*** 后序遍历** @return 遍历结果* @author Korbin* @date 2023-01-18 18:21:11**/public List postOrderTraverse() {return postOrderTraverse(root);}/*** 后序遍历** @param rootNode 根结点* @return 遍历结果* @author Korbin* @date 2023-01-20 09:19:10**/public List